【问题标题】:SQL DateAdd to column with UK and US format dataSQL DateAdd 到包含英国和美国格式数据的列
【发布时间】: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。

标签: sql datetime


【解决方案1】:

这个怎么样:

CASE WHEN MYCOL = 'N/A' THEN MYCOL 
     ELSE CASE WHEN ISDATE(CONVERT(Datetime,MYCOL,4)) = 1 THEN DateAdd(day,1,CONVERT(VARCHAR(30),MYCOL,4)) ELSE MYCOL END

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多