2017-03-02 26 views
0

我试图将列的日期连接到一天的固定时间,然后将整个事件作为DATETIME在连接的日期和时间上铸造DATETIME

固定时间是上午5:30。

我使用的日期列需要调整,因为它显示结束什么时候运行的日期/时间;我想用开始日期/时间。

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

以下是声明全文:

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

下面是我收到错误消息:

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

我试图测试这些语句来调查这个问题,但他们都对自己的运行OK:

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

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

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

我是一直困扰着如何解决这个问题。任何帮助将非常感激。

+0

是否将'ConfTask。[LastExecutedDuration]'存储为'TIME','INT','NUMERIC()'值。 。? – 3BK

+0

它存储为'Decimal(18,0)' –

+0

这不可能与您转换为特定格式'(103)'的事实相关,对吧?因为在你的例子中,你将'GETDATE()'转换为'(103)',而不是'ConfTask。[LastExecutedDate]''。你是否试过用不同的日期格式运行它,比如'(101)',或者根本没有提供特定的格式? (希望不是一个愚蠢的问题......) – 3BK

回答

0

这工作:

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

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 
            ) 
          ) 
        ) 
      ) 
+0

啊,我正在使用的列中有一些空值。谢谢,这帮助我追踪了这个问题。 –

+0

我当时有点仓促...处理空值消除了错误,但没有返回正确的日期/时间格式。 –