簡體   English   中英

在 T-SQL 中比較日期

[英]Compare dates in T-SQL

我有一個數據類型為varchar的列date的表。 值為'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

我如何比較這兩者? 我收到此錯誤:

從字符串轉換日期和/或時間時轉換失敗。

我想刪除時間分量並比較'2022-03-08''2022-3-8' 請注意月份和日期數字中的前導零。

TRY_CASTTRY_CONVERT會將您的字符串轉換為日期,如果不可能則返回 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 個一位數更改為兩位數( 1=>01 )。 使用PARSENAME進行拆分,使用concat進行連接字符串

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*/)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM