Sql-Server

如何選擇有效的最大日期?

  • May 29, 2022

我有一個日期為 va​​rchar(不要問為什麼)。我需要選擇 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會更快,特別是如果您按這樣的欄位索引表dtCREATE CLUSTERED INDEX IX_TMP_DT ON #tmp (dt)。這將儲存已經按dt列排序的數據,如果您要重複執行SELECT查詢,這將是有益的。可以通過查看執行計劃以及時間和 I/O 統計數據來驗證差異。

引用自:https://dba.stackexchange.com/questions/312704