【发布时间】:2018-10-12 09:35:43
【问题描述】:
我有一列存储日期时间数据。但数据可能是美国格式、英国格式,也可能是一些垃圾数据。事情是我想尝试将 DataAdd 添加到此列。当数据为英国或美国格式时,我将 DateAdd + 1,否则将保留垃圾数据。
之前 ===== 之后
2018 年 1 月 30 日 == 2018 年 1 月 31 日
20.1.18 ==== 21.1.18
不适用 ======= 不适用
方法一:
CASE WHEN ISDATE(MYCOL) = 1 THEN DateAdd(day,1,MYCOL) ELSE MYCOL END
结果:只有美国格式会 +1,英国格式会被忽略
方法二:
CASE WHEN ISDATE(CONVERT(Datetime,MYCOL,4)) = 1 THEN DateAdd(day,1,CONVERT(VARCHAR(30),MYCOL,4)) ELSE MYCOL END
结果:在ISDATE(CONVERT(Datetime,MYCOL,4))处从字符串转换日期和/或时间时转换失败,因为垃圾数据“N/A”
已编辑:
垃圾数据不会只有 “N/A”,可以是任何东西。
【问题讨论】:
-
为什么要记下 N/A = Null?
-
如果您有混合格式,我认为没有答案。你会如何解释 01/02/18?或者您是否 100% 确定数据库中的美国日期有“/”分隔符,而英国日期有“.”。没有标准甚至惯例可以说明这一点。
-
@TomC,到目前为止,我在列中遇到 dd.MM.yy, dd MMM yyyy, MM/dd/yyyy。我预见该列中会有新的格式。那么你建议我在我的 C# 代码中添加 dateAdd 吗?
-
我认为这是不可能的。除非您 100% 知道用户输入的内容,否则无法确定小于 13 天的日期是 DD/MM 还是 MM/DD。在你能回答这个问题之前,尝试其他任何事情都没有意义。尝试并获得一组独特的格式,并为每个格式查看每个组件的数字范围。日期永远不应该存储在这种类型的字符串中。是的 - 如果您有一个写入数据的 C# 应用程序,则在其中强制执行日期一致性,并将数据类型设置为日期而不是字符串。
-
您使用的是哪个 dbms? ANSI SQL 的日期格式只有 YYYY-MM-DD。