比较 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_CAST
或 TRY_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 用于 split 和 concat 用于 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*/)
我有一个 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_CAST
或 TRY_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 用于 split 和 concat 用于 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*/)