SQL如果至少有一条记录满足条件则格式化整个字段(列)的日期

标签 sql postgresql tsql postgresql-12

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

日期可以采用以下格式:

30.12.2019 或 12.30.2019 或

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

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

我想在 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) = '.';

然而,这只涵盖了

的场景

30.12.2019 and 12/30/2019.

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

谢谢!

最佳答案

评论太长了。

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

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

这些文件中的每一个都有一些其他的区别特征,这些特征会告诉您它来自哪个导出规范,以便您可以相应地接受它。如果客户临时构建这些东西,并在运行之间进行更改,那么将协议(protocol)正式化符合他们和您的最大利益,这样他们就不必每次都想那么多。

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

关于SQL如果至少有一条记录满足条件则格式化整个字段(列)的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58834370/

相关文章:

sql - 寻求 Reporting Services 身份验证建议

mysql - SQL - 除当前月份外的每个月

python - Django ManyToMany 关系 "Contains"声明

php - 统计每个销售员每月的总数

debugging - 你如何使用 postgres 调试函数?

postgresql - 使用 Postgresql 进行多语言全文搜索

mysql - 从 MySQL 中的子查询返回一列中的值列表作为文本字符串

sql - T-SQL组行成列

mysql - PowerSchool:如何查询过去的注册情况

sql - XML 数据类型方法 "value"的参数 1 必须是字符串文字