首页 > 解决方案 > SQL Server 日期时间转换问题

问题描述

下面是我正在使用的 SQL 服务器查询,

SELECT
    *,
    CONCAT(CONVERT(date, startdate, 104), RIGHT(+' '+ CONVERT(VARCHAR, startTime), 8)) AS NewDate,
    CONCAT(CONVERT(date, '7.8.2018', 104), RIGHT(+' '+ CONVERT(VARCHAR, '3:51:23'), 8)) AS NewDate2,
    CASE
       WHEN CONCAT(CONVERT(date, startdate, 104), RIGHT(+' '+ CONVERT(VARCHAR, startTime), 8)) < CONCAT(CONVERT(date, '7.8.2018', 104), RIGHT(+' '+ CONVERT(VARCHAR, '3:51:23'), 8))  
          THEN '1' 
          ELSE '0' 
    END AS comment
FROM
    [dbo].[LMT2_ServerLicenseUser] 
WHERE
    CONCAT(CONVERT(date, startdate, 104), RIGHT(+' '+ CONVERT(VARCHAR, startTime), 8)) > CONCAT(CONVERT(date, '7.8.2018', 104), RIGHT(+' '+ CONVERT(VARCHAR, '3:51:23'), 8))

输出如下图所示:

在此处输入图像描述

我在这里比较列“NewDate”和“NewDate2”,如果条件为真,则在一个名为“comment”的新列中分配值,该列显示错误值。

请帮助我了解问题出在哪里,是日期时间转换问题还是其他问题。

标签: sql-serversql-server-2008

解决方案


您可以尝试使用cast(startdate as datetime) + cast(startTime as datetime)让列转换为DateTime类型然后比较,因为您无法比较字符串DateTime格式。

Select *
    ,CONCAT( CONVERT(date, startdate, 104), RIGHT(+' '+ CONVERT(VARCHAR,startTime),8)) AS NewDate 
    ,CONCAT( CONVERT(date, '7.8.2018', 104), RIGHT(+' '+ CONVERT(VARCHAR,'3:51:23'),8)) AS NewDate2
    ,case 
        cast(startdate as datetime) + cast(startTime as datetime) >  cast('7.8.2018' as datetime) + cast('3:51:23' as datetime) 
        then '1' 
        else '0' 
        end as comment
from [dbo].[LMT2_ServerLicenseUser] 

推荐阅读