【问题标题】:Add to DATE hour - TSQL添加到 DATE 小时 - SQL
【发布时间】:2021-12-04 05:58:30
【问题描述】:

我有一个列类型time(7)

我想要的是将时间列添加到日期。

我设法使用GETDATE() 函数获取唯一日期,但我未能在日期旁边添加时间部分。

查询:

SELECT [Compay]
      ,[Time]
      ,CAST(GETDATE() AS DATE) AS Today
      ,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) AS Today_AS_Nvarchar
      ,CAST([Time] AS NVARCHAR) AS Time_AS_Nvarchar
      ,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR) AS Today_Time_AS_Nvarchar
      ,CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)
  FROM [Testing_Env].[dbo].[Com_CD_Test]

错误:

Conversion failed when converting date and/or time from character string.

错误出现在CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)

有没有更简单/正统的方法来实现它?

【问题讨论】:

    标签: date tsql time format


    【解决方案1】:

    您不能像添加旧数据类型一样将新的日期和时间数据类型添加在一起;我个人认为这也更好,因为它可以阻止人们将日期和时间视为数值。

    假设您有一个 date 列和一个 time 列,您有几个选项。第一个是将CAST/CONVERT 都添加到datetime,然后将它们“添加”在一起。因为“旧”数据类型的工作原理更像是数值,但是,如果 time 的精度为 3 或更高(因为 datetime 仅精确到 1/300),您将失去 time 值的准确性秒):

    DECLARE @TimeValue time(7) = '17:52:12.1234567',
            @DateValue date = '20211016';
    SELECT CONVERT(datetime, @DateValue) + CONVERT(datetime, @TimeValue);
    

    如果不能降低准确性,那么您可以date 值使用转换并使用DATEDIFFDATEADD。对于time(7),您需要使用纳秒(因为微秒不够准确)。不幸的是,这带来了另一个问题。 DATEADD 无法处理 bigint 值(仍然)并且没有 DATEADD_BIG(就像有 DATEDIFF_BIG),所以这变得过于复杂。您需要先获取以毫秒为单位的差异,然后以纳秒为单位添加余数,以仍精确到 1/1000000 秒:

    DECLARE @TimeValue time(7) = '17:52:12.1234567',
            @DateValue date = '20211016';
    SELECT DATEADD(NANOSECOND,DATEDIFF_BIG(NANOSECOND,'00:00:00', @TimeValue) % 1000000,DATEADD(MILLISECOND, DATEDIFF_BIG(MILLISECOND,'00:00:00', @TimeValue), CONVERT(datetime2(7),@DateValue)));
    

    最后,是的,您可以将值转换为字符串,然后再转换为datetime2 值;这可能是最简单的方法。您只需要确保使用样式代码:

    DECLARE @TimeValue time(7) = '17:52:12.1234567',
            @DateValue date = '20211016';
    SELECT CONVERT(datetime2(7),CONVERT(varchar(10), @DateValue, 23) + 'T' + CONVERT(varchar(17), @TimeValue, 114),126);
    

    【讨论】:

    • 非常感谢您的宝贵时间!!!!
    猜你喜欢
    • 2020-02-03
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多