TSQL 日期时间问题

Posted

技术标签:

【中文标题】TSQL 日期时间问题【英文标题】:TSQL DateTime issue 【发布时间】:2009-08-11 21:23:42 【问题描述】:

我在这里有一个简化的案例:一个包含 5 个字段的表,分别为 startdate、starttime、enddate、endtime 和 totalduration,均为 varchar(20) 类型。日期字段的格式类似于“02/02/2009”,时间格式类似于“02:02:00”。根本没有空值。以下查询没有问题:

  select 
    cast(startdate + ' ' + starttime as datetime) StartDt, 
    cast(enddate + ' ' + endtime as datetime) EndDt,
    convert(datetime, cast(enddate + ' ' + endtime as datetime) - 
      cast(startdate + ' ' + starttime as datetime), 108) as DurationCalc,
    Totalduration
  from myTable

这很好,我得到了千行数据:

  StarDt               EndDt     DurationCalc        Totalduration
  2009-01-01 12:00:00  ...       03:34:12            03:34:13
   ....

但是,当我尝试应用 WHERE 子句按差异过滤掉行时,出现超出范围的错误:“将 char 数据类型转换为日期时间数据类型导致超出范围日期时间值”:

  where 
     cast(startdate + ' ' + starttime as datetime) < 
     cast(enddate + ' ' + endtime as datetime) 
     -- this additional condition caused problem
     and
     datediff(s,
     convert(datetime, cast(enddate + ' ' + endtime as datetime) - 
       cast(startdate + ' ' + starttime as datetime), 108),
     convert(datetime, Totalduration, 108)) > 1

由于我的表中有这么多行,因此很难逐行识别问题。我不确定我在这里错过了什么,没有过滤掉无效行,或者是否有任何方法可以找出存在超出范围的行?有什么建议吗?

如果我删除“附加条件”datediff(...),我可以得到行作为结果。前几行似乎没有任何问题。我应用了 Top 1 来选择,我仍然得到超出范围的错误。

【问题讨论】:

什么是 TotalDuration?您正在尝试将其转换为 DateTime;可以转换吗? TotalDuration 中存储的数据是什么样的? 我看不出为什么要转换成字符串?不能只加上日期和时间吗? 实际上 MS SQL Management Studio 的查询确实显示了所有行,直到出现问题。如果有错误,则聚焦结果选项卡。您可以看到显示所有好行的结果选项卡。 TotalDuration 采用时间格式,例如“01:23:00”。问题实际上是这个领域。某些持续时间是“25:xx:xx”,这是无效时间(小时 > 24)。我终于从 Studio 的查询结果(部分或所有可能的好结果)中找到了问题,并带有一条错误消息,就像我之前的评论一样。 【参考方案1】:

Sql Server 有一个IsDate() 函数。使用它来识别您的问题行。然后修复表,首先将数据保留为 DateTime 列。

【讨论】:

小心:不要尝试在 WHERE 或 CASE 子句中将有问题的查询与额外的 ISDATE 结合起来:您可能仍然会收到错误,因为 SQL Server 有一种不优化表达式的奇怪方式.因为首先需要违规行,所以这不是什么大问题,但是不要尝试将非违规行全部转换。【参考方案2】:

我之前看到过这个错误,通常是由于美国和英国的日期格式,这取决于数据是如何插入到数据库中的。

另一个问题(相关)是,当使用日期时间时,您使用日期作为参数,在进行日期范围(或日期差异计算)时,您总是需要在结束日期上多加 1 天

暗夜

【讨论】:

以上是关于TSQL 日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章

TSQL 日期时间 ISO 8601

TSQL - 查询两个日期字段之间的日期列表

TSQL:从字符串转换日期和/或时间时转换失败

如何在 TSQL 函数中检查正确的日期时间格式?

sql 明智的,日期时间,tsql.sql

TSQL - 如何查找名称中包含日期的所有表