在连接的日期和时间上投射DATETIME

时间:2017-03-02 13:02:43

标签: tsql sql-server-2012

我正在尝试将列的日期连接到当天的固定时间,然后将整个事件CAST连接为DATETIME

固定时间是早上5:30。

我正在使用的日期列需要进行调整,因为它显示了某些内容的结束日期/时间;我想使用开始日期/时间。

开始日期/时间不能作为自己的列,但是我有另一个列,其持续时间为几秒钟,因此我可以使用DATEADD将结束日期/时间回滚到开始日期/时间。

以下是完整的陈述:

CAST(CONVERT(VARCHAR(10), DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate]), 103) + ' ' + '05:30' as DATETIME)

以下是我收到的错误消息:

  

导致将varchar数据类型转换为日期时间数据类型   在超出范围的价值。

我已经尝试过测试这些语句来调查这个问题,但它们都可以自行运行:

CAST(CONVERT(VARCHAR(10), GETDATE(), 103) + ' ' + '05:30' as DATETIME)

CAST('2017-03-02' + ' ' + '05:30' as DATETIME)

DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate])

我对如何解决这个问题有点困惑。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

显然,您必须在列中包含一些意外值。

我建议使用如下查询找到它们:

SELECT LastExecutedDuration, LastExecutedDate
FROM ConfTask
WHERE TRY_CONVERT(datetime,
                  CONVERT(VARCHAR(10),
                          DATEADD(second,
                                  -ConfTask.[LastExecutedDuration],
                                   ConfTask.[LastExecutedDate]
                                  )
                          103
                         ) + ' ' + '05:30')
                 )

您还可以通过使用日期函数来简化逻辑:

select dateadd(minute,
               5 * 60 + 30,
               convert(datetime,
                       convert(date,
                               dateadd(second,
                                       - ConfTask.LastExecutedDuration
                                       ConfTask.LastExecutedDate
                                      )
                              )
                      )
              )

答案 1 :(得分:0)

这有效:

CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(ss,-ConfTask.[LastExecutedDuration], ConfTask.[LastExecutedDate]), 112)) + ' ' + CONVERT(CHAR(8), '05:30:00', 108)