【问题标题】:Casting DATETIME on concatenated date and time在连接的日期和时间上投射 DATETIME
【发布时间】:2017-03-02 22:00:21
【问题描述】:

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

固定时间是早上 5:30。

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

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

这是完整的声明:

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

这是我收到的错误消息:

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

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

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

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

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

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

【问题讨论】:

  • ConfTask.[LastExecutedDuration] 是否存储为 TIMEINTNUMERIC() 值...?
  • 存储为Decimal(18, 0)
  • 这不可能与您正在转换为特定格式(103) 的事实有关,对吧?因为在您的示例中,您将GETDATE() 转换为(103),而不是ConfTask.[LastExecutedDate])。您是否尝试过使用不同的日期格式(例如 (101))运行它,或者根本不提供特定格式? (希望不是一个愚蠢的问题......)
  • 我认为您可能走在正确的轨道上,因为我尝试分别格式化日期和时间部分,这似乎有效(请参阅下面的答案)。不是 100% 确定它为什么会这样工作,但是你去吧!感谢您查看此内容。

标签: tsql sql-server-2012


【解决方案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
                                      )
                              )
                      )
              )

【讨论】:

  • 啊,我使用的列中有一些空值。谢谢,这帮助我找到了问题。
  • 我有点仓促......处理空值消除了错误,但没有返回正确的日期/时间格式。
【解决方案2】:

这行得通:

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

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 2020-07-19
    • 2014-06-16
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多