1

我从客户端以文本格式接收数据,然后必须将其转换为 MS SQL Server 2016 和 Postgresql 12 的日期。

日期可以采用以下格式:

30.12.2019 或 12.30.2019 或

2019 年 12 月 30 日或 2019 年 12 月 30 日

幸运的是,相同的格式适用于整个字段(列),但是我的查询需要确定它是其中的哪一个。

我想在 TSQL 和 POSTGRESQL 中应用条件子句(如 CASE WHEN/IF)。这是我到目前为止所拥有的:

TSQL:

SET DATEFORMAT mdy;   UPDATE mytable SET
finaldate =CAST(TRY_CONVERT(varchar(255),RIGHT(mydate,4)+LEFT(mydate,2)+SUBSTRING(mydate,4,2))
AS DATE) WHERE mydate <> '00/00/0000' AND LEFT(mydate,2) < 13 AND
SUBSTRING(mydate,3,1) = '/';

SET DATEFORMAT dmy;  
UPDATE mytable SET finaldate=CAST(TRY_CONVERT(varchar(255),RIGHT(mydate,4)+SUBSTRING(mydate,4,2)+LEFT(mydate,2)) AS DATE)
WHERE mydate <> '00.00.0000' AND SUBSTRING(mydate,4,2) < 13 AND SUBSTRING(mydate,3,1) = '.';

POSTGRESQL:

UPDATE my_table SET finaldate = TO_DATE(mydate, 'DD/MM/YYYY')
WHERE mydate <> '00/00/0000' AND CAST(LEFT(mydate,2) AS INTEGER) < 13 AND SUBSTRING(mydate,3,1) = '/';


UPDATE my_table SET finaldate = TO_DATE(mydate, 'DD.MM.YYYY')
WHERE mydate <> '00.00.0000' AND CAST(SUBSTRING(mydate,4,2) AS INTEGER) < 13 AND SUBSTRING(mydate,3,1) = '.';

但是,这仅涵盖以下场景

2019 年 12 月 30 日和 2019 年 12 月 30 日。

如果特定位置的数字之一超过 13,那么如何使用条件,那么所有日期都将被格式化。

谢谢!

4

1 回答 1

1

评论太长了。

您在这里放置的任何东西最终都可能会失败。假设客户有一个缓慢的月份,他们发送的所有交易都是从第一天到第十一天。您将无法辨别预期的日期格式。

但除此之外,还有一个解决方案。客户知道他们发送给您的每个文件的导出规范是什么。多年来,我一直是可能数百个平面文件的进口商或出口商,首先要做的是与交易另一端的技术资源取得联系并建立基本规则,包括日期格式。

很可能这些文件中的每一个都有一些其他显着特征,可以告诉您它来自哪个导出规范,以便您可以相应地接受它。如果客户临时构建这些东西,并在运行之间进行更改,那么将协议正式化符合他们和您的最佳利益,这样他们就不必每次都考虑得这么辛苦.

但是 TL;DR 是你不会在 Stack Overflow 上找到你最好的答案,你会在你客户的 IT 部门找到它。

于 2019-11-13T14:13:04.360 回答