Sql-Server
如何選擇有效的最大日期?
我有一個日期為 varchar(不要問為什麼)。我需要選擇 Max(date)。但是,日期可能有誤,例如 2034-34-34。我想選擇有效且不大於今天的最大日期。這是 t-sql。
我試過了:
create table #tmp ( dt varchar(10) ) insert into #tmp values ('2022-02-15'),('2034-34-34') select max(dt) from #tmp having isdate(max(dt))=1 and max(dt)<=current_timestamp
作為回報,我什麼也得不到。
可能是也可能不是問題,但如果有人儲存了有效日期,
max(dt)
也top 1 ... order by dt desc
不會返回正確的結果,例如:‘04/15/2030’create table #tmp ( dt varchar(10) ); insert into #tmp values ('2022-02-15'),('2034-34-34'),('04/15/2030'); select max(dt) from #tmp where isdate(dt)=1; 2022-02-15
原因是 dt 作為字元串進行比較。在比較之前,您可以將有效的“日期”轉換為日期:
select max(cast(dt as date)) from #tmp where isdate(dt)=1; 2030-04-15
您的
HAVING
子句是您文章的範例查詢中的問題。HAVING
通常用於過濾一組值中的*聚合。*此外,您正在評估最大值是否是該HAVING
子句中事件順序的日期,而不是首先過濾掉非日期值,然後獲取最大值,例如您現在的答案。為您提供相同答案的另一個版本的查詢將是:
create table #tmp ( dt varchar(20) ) insert into #tmp values ('2022-02-15'),('2034-34-34'),('2022-03-14') select max(convert(date, dt)) from #tmp where isdate(dt)=1
通過消除子句的使用,這可能
ORDER BY
會更快,特別是如果您按這樣的欄位索引表dt
時CREATE CLUSTERED INDEX IX_TMP_DT ON #tmp (dt)
。這將儲存已經按dt
列排序的數據,如果您要重複執行SELECT
查詢,這將是有益的。可以通過查看執行計劃以及時間和 I/O 統計數據來驗證差異。