比较 T-SQL 中的日期

Compare dates in T-SQL

我有一个 table,其列 date 的数据类型为 varchar。值为 '2022-03-08 07:00',2022-03-08 07:30 ... .

在我的存储过程中,我有一个类型为 DATE 且值为 '2022-3-8'

的参数
DECLARE @d DATE = '2022-3-8'

SELECT *, r.date AS date, @d AS d 
FROM Readings AS r
WHERE CONVERT(VARCHAR, r.date, 23) = @d

我如何比较这两者?我收到此错误:

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

我想删除时间部分并比较 '2022-03-08''2022-3-8'。请注意月份和日期数字中的前导零。

TRY_CASTTRY_CONVERT 会将您的字符串转换为日期,如果不可能则 return null。

SELECT *, TRY_CAST(r.date AS DATE) as date, @d AS d
FROM Readings r
WHERE TRY_CAST(r.date AS DATE) = @d

示例:

DECLARE @d DATE = '2022-3-8';
WITH Readings AS 
(
    SELECT '2022-03-08 07:00' AS date  
    UNION ALL 
    SELECT '2022-03-08 07:30'
    UNION ALL
    SELECT '2022-03-06 17:30' --will be false
    UNION ALL
    SELECT '2022-02-31 07:30' --invalid string
)
SELECT r.date as OriginalString
, TRY_CAST(r.date AS DATE) as CastDate
, TRY_CONVERT(DATE,r.date,23) as ConvertDate
, @d AS d
, CASE WHEN TRY_CAST(r.date AS DATE) = @d THEN 1 ELSE 0 END AS Matched
FROM Readings r

使用 right(replicate('0',2)+value,2) 使您能够更改 1 one_digit 数字two_digit 数 (1=>01)。 使用 PARSENAME 用于 splitconcat 用于 connect strings

DECLARE @d DATE = '2022-3-8'

SELECT Concat(( Parsename(Replace(@d, '-', '.'), 3) )/*year*/, '-', RIGHT(
              Replicate('0', 2) + ( Parsename(Replace(@d, '-', '.'), 2) ), 2)
       /*month*/,
              '-', RIGHT(Replicate('0', 2) + ( Parsename(Replace(@d, '-', '.'),
                                               1) ), 2
                   )/*day*/) as d

或在您的查询中

DECLARE @d DATE = '2022-3-8'

SELECT *,
       r.date
       AS date,
       ,@d
FROM   readings AS r
WHERE  CONVERT(VARCHAR, r.date, 23) = 
Concat(( Parsename(Replace(@d, '-', '.'), 3) )/*year*/, '-', RIGHT(
       Replicate('0', 2) + ( Parsename(Replace(@d, '-', '.'), 2) ), 2)/*month*/,
       '-',
       RIGHT(Replicate('0', 2) + ( Parsename(Replace(@d, '-', '.'), 1) ), 2)
       /*day*/)