【问题标题】:SQL datediff function data convertion errorSQL datediff函数数据转换错误
【发布时间】:2020-03-21 13:14:49
【问题描述】:

我在查询中计算了字段,而它减去了两个日期之间的天数差。我正在使用 SQL Server 执行我的查询。

当我使用以下功能时:

Cast(DATEDIFF(D,ACTUALFINISHDATE,PROJFINISHDATE) as int) AS 'Elasped Days

两个日期字段都是datetime 日期类型(例如2019-02-23 00:00:00.000)。我试过Convert() 而不是Cast(),但仍然遇到同样的问题。

我收到以下错误:

Msg 242, Level 16, State 3, Line 7 varchar 数据的转换 type 到 datetime 数据类型导致超出范围的值。

在转换之前是否需要将日期时间转换为varchar

【问题讨论】:

  • 发布一些示例数据。
  • ACTUALFINISHDATEPROJFINISHDAT 的数据类型是什么?它看起来像它的VARCHAR
  • @DigvijayS 两者都是日期时间但包含空值
  • @Richard 如果这两列都是日期时间,那么这个错误是不可能的。要么你专注于错误的代码片段,要么你有字符串(varchar、nvarchar)。

标签: sql sql-server datediff


【解决方案1】:

ActualFinishDate 或 ProjFinishDate 中必须有错误数据。要查找不良数据...

Select ActualFinishDate
From YourTable
Where ActualFinishDate > '' 
      And IsDate(ActualFinishDate) = 0

【讨论】:

  • 它返回大量空行。所以对于空值,我需要考虑为 0?
  • 空值不是你的问题。我修改了查询以过滤掉空值。请重试。
【解决方案2】:

首先,不需要将结果转换为 int。只需使用:

DATEDIFF(DAY, ACTUALFINISHDATE, PROJFINISHDATE)

其次,DATEDIFF()datetime 数据类型上运行良好。所以,有两种可能:

  1. 您的列并不是真正的DATETIMEE,而是字符串。
  2. 其他原因导致错误。

我猜是 (1)。您可以通过以下方式进行测试:

select ACTUALFINISHDATE, PROJFINISHDATE
from t
where try_convert(datetime, coalesce(ACTUALFINISHDATE, getdate())) is null or
      try_convert(datetime, coalesce(PROJFINISHDATE, getdate())) is null;

如果列填充了合法值,则不会返回任何行。

【讨论】:

  • 我在两列中都有空值。这会导致这个问题吗?
  • @理查德。 . . NULL 值不会导致类型转换问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多