簡體   English   中英

日期轉換“超出范圍值”錯誤,在 WHERE 子句下轉換日期

[英]Date conversion "Out of range value" error, converting dates under WHERE clause

我正在使用一個表,該表將日期值存儲為各個“世紀”、“年”、“月”和“日”列下的整數。 (Year 列只獲取年份的最后兩位數字,Century 列的范圍分別為 2000 年之前和 2000 年之后的年份從 0 到 1。)

我正在嘗試在特定日期之后過濾數據。 這些列必須轉換為單個日期或日期時間值,以便可以更改報告參數。 現在 WHERE 子句看起來像這樣:

WHERE convert(datetime, CAST( ((19 + Table.Century) * 100 + Table.Year) as varchar) + '-' +  (Table.Month as varchar) + '-' + CAST(Table.Day as varchar), 121) > Convert(datetime,'2020-01-01', 121)

但是,當我嘗試運行查詢時,它總是拋出一個錯誤:

將 varchar 數據類型轉換為 datetime 數據類型導致值超出范圍。

問題似乎出在 Month 列中。 如果我將任何 30 天的月份(或二月)替換為 Table.Month 值,它將引發錯誤。 31 天月工作正常。 但是,數據本身沒有越界日期。 此外,該語句運行良好,如果我把它放在 SELECT 語句中也不會中斷。

我的印象是 WHERE 語句正在評估每個可能的 Day 值與每個可能的 Year 值的每個可能的 Month 值等,並最終檢查諸如“2020-02-30”之類的日期。 我如何讓它停止這種行為?

使用datefromparts()

where datefromparts(1900 + century * 100 + year, month, day) > '2020-01-01'

也就是說,您可能有無效的值。 你應該調查那些:

select century, year, month, day
from t
where try_convert(concat(1900 + century * 100 + year, '-'
                         month, '-', day)
                 ) is null

這是有效的,因為 SQL Server 擅長解釋諸如'2020-1-1'日期。

暫無
暫無

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

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