【问题标题】:How to handle date conversion error in SQL?如何处理 SQL 中的日期转换错误?
【发布时间】:2014-01-29 04:20:52
【问题描述】:

所以我正在尝试将 SQL 数据库中的字符串转换为日期时间值。

我在这样的表格中有一些日期:

23/12/2013 16:34:32
24/12/2013 07:53:44
24/12/2013 09:59:57
24/12/2013 12:57:14
24/12/2013 12:48:49
24/12/2013 13:04:17
24/12/2013 13:15:47
24/12/2013 13:21:02
24/12/2013 14:01:28
24/12/2013 14:02:22
24/12/2013 14:02:51

不幸的是,它们被存储为字符串

我想将它们转换为日期时间

SELECT CONVERT(datetime, analysed, 103 )
FROM OIL_SAMPLE_UPLOAD

但是我在运行查询时收到此消息

导致将 varchar 数据类型转换为 datetime 数据类型 在一个超出范围的值。

大概是因为某些值的格式不正确(尽管我还没有发现其中任何一个)

如果某些值不转换也没关系,我只需要一种处理这种情况的方法。

类似 ISNULL(CONVERT(datetime, analysed, 103 )) 的东西会很好,只是转换函数在失败时不返回 NULL。

【问题讨论】:

  • 要清楚字符串是 dd/MM/yyyy hh:mm:ss 格式

标签: sql string tsql error-handling type-conversion


【解决方案1】:

对于 SQL Server,您可以使用ISDATE() 函数检查值是否为有效日期

SELECT CASE WHEN ISDATE(analysed)=1 THEN CONVERT(datetime, analysed, 103 ) 
            ELSE '' END
FROM OIL_SAMPLE_UPLOAD

【讨论】:

  • 我不希望对我正在使用的数据库进行任何更改。即:我更愿意更改 SET DATEFORMAT dmy;除非更改仅在查询期间存在。
  • 这不会对数据库进行任何更改,它仅用于检查持续时间查询执行
  • 为此,我需要将 DATEFORMAT 设置为 dmy。
  • 我可以通过使用 STUFF(STUFF(analyzed, 4, 2, SUBSTRING(analyzed, 1, 2)), 1, 2, SUBSTRING(analyzed, 4, 2)) 来解决这个问题
【解决方案2】:

您可以使用TRY_CONVERTTRY_CAST 函数

【讨论】:

  • 请注意,这些函数仅在 SQL Server 2012 及更高版本 (110) 中可用
【解决方案3】:

如果您只想要日期部分,请使用SUBSTRING 并按如下方式计算日期。这至少可以为您提供正确的日期部分。

SELECT CONVERT(datetime, SUBSTRING(analysed, 0, 11), 103 )
FROM OIL_SAMPLE_UPLOAD

【讨论】:

  • 需要 11 个字符 SELECT CONVERT(datetime, SUBSTRING(analyzed, 0, 11), 103 )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多