【问题标题】:Concatenate date and string to create datetime in SQL连接日期和字符串以在 SQL 中创建日期时间
【发布时间】:2017-09-05 10:33:30
【问题描述】:

我需要将 SQL 中的日期时间和时间字段连接到单个日期时间。

例如,我的日期时间为 2017-09-05 00:00:00.000,字符串时间为 11:00。我想要的是 2017-09-05 11:00:00.000 视图中的单个字段

我尝试将日期时间转换为日期,然后将新日期和字符串日期字段连接在一起,但这不起作用。

要转换我正在使用的日期时间:CAST(dtDate AS DATE) AS dtNewDate 可以正常工作。然后当我使用:CAST(dtNewDate + szTime AS datetime) AS dtNewDateTime 时,视图的创建工作正常,但选择前 1000 个会返回“从字符串转换日期和/或时间时转换失败。”

有没有更简单的方法可以做到这一点,或者任何人都可以提供一些建议(除了首先将日期和时间存储在单个日期时间字段中,因为它由我无权访问的第三方应用程序填充改变)

【问题讨论】:

标签: sql sql-server date datetime2


【解决方案1】:

您可以将两个datetime 值相加,所以试试:

CAST(dtDate AS DATETIME) + CAST(CAST(szTime AS TIME) as DATETIME)

【讨论】:

  • 您可以省略TIME 演员表——11:00 将直接转换为DATETIME(即1900-01-01 11:00)。即便如此,这个技巧对DATETIME2 也不起作用,如果您需要精度,这很不幸。
【解决方案2】:

假设11:00 代表11:00:00,你可以这样做:

SELECT dtDate + CONVERT(DateTime, szTime, 108)
FROM...

See a live demo on rextester

【讨论】:

    【解决方案3】:

    您可以尝试关注。

    DECLARE @YourDate AS DATETIME
    SET @YourDate = CONVERT(VARCHAR(10), '2017-09-05 00:00:00.000', 111) + ' 11:00'
    PRINT @YourDate
    

    【讨论】:

      【解决方案4】:

      另一种方法是从您的字符串字段中获取小时,将其转换为 int,然后将其作为小时添加到日期时间

      declare @date datetime = '20170905'
      declare @stringtime varchar(5) = '11:00'
      
      select left(@stringtime, 2),
             dateadd(hour, convert(int, left(@stringtime, 2)), @date)
      

      如果您还需要会议记录,您可以这样做:

      declare @date datetime = '20170905'
      declare @stringtime varchar(5) = '11:05'
      
      select left(@stringtime, 2),
             right(@stringtime, 2),
             dateadd(minute, convert(int, right(@stringtime, 2)), dateadd(hour, convert(int, left(@stringtime, 2)), @date))
      

      这仅在字符串字段始终采用 hh:mm 格式时才有效

      【讨论】:

      • 秒和小数秒呢?
      • @Jodrell 我没有提到这一点,因为它们也不在问题中。 OP 声明时间为 hh:mm 格式。我什至在评论中问过这个
      • @Jodrell 我还用粗体字提到这仅在时间为 hh:mm 格式时才有效
      【解决方案5】:

      如果你关心precision with DATETIME2,

      DECLARE @D DATETIME = '2017-01-01';
      
      DECLARE @T varchar(7) = '11:00';
      
      SELECT DATEADD(day, DATEDIFF(day, '19000101', @D), CAST(CAST(@T AS TIME) AS DATETIME2(7)));
      

      Running example here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2015-02-14
        相关资源
        最近更新 更多