曾經遇到這樣的情況,在數據庫的Meeting表中有PublishTime (DateTime,8)字段,用來存儲一個開會時間,在存入時由於要指明開會具體時間,故格式為yyyy-mm-dd hh:mm:ss,而我們查詢時是通過yyyy-mm-dd來進行的,即查詢某一天的所有會議信息,這樣如果通過select * from Meeting where PublishTime=@PublishTime (參數@PublishTime為yyyy-mm-dd格式)語句進行查詢將無法得到正確結果,比如我們要查詢2004年12月1日的會議信息,在輸入2004-12-01時就不能得到查詢結果,而這種查詢又不能要求輸入具體的hh:mm:ss.
此時我們需要使用convert函數,它可以將一種數據類型的表達式轉換為另一種數據類型的表達式.此處我們先將數據庫內的datetime類型轉換為char類型,由於輸入的參數是10位的,所以寫成
select * from Meeting where convert(varchar(10),PublishTime,121))=@PublishTime,這樣在查詢時數據庫得到參數后先自動將數據庫內的信息轉換為yyyy-mm-dd格式的10位字符,只要與參數相同即可返回查詢結果.而convert中的121是指將datetime類型轉換為char類型時獲得包括世紀位數的4位年份(轉載)
日期格式的like模糊查詢真的好怪,在一個項目中,我試了很多種查法:
select * from T where sendTime like '%2007_12_%' 可以查詢2007年12月的所有記錄
如果like條件改為'%2007-12-%' ,'%2007_12_3%' ,或'%2007_12_30%' 都查不出數據。還有:
select * from T where sendTime like '%12_30%' 可以查詢12月30日的所有記錄
如果like條件改為'%07_12_30%' 也查不出數據。
一直搞不明白是怎么回事。不過現在找到了一個很好的解決方法:
將數據庫中的時間字段格式改為字符串格式。
SELECT * FROM T WHERE Convert(varchar,sendTime,120) LIKE '2007-12-30%'
其中:T為數據庫的表,sendTime是數據庫中的時間字段的字段名。這樣就可以查詢2007-12-30的記錄了。
順便把SQL Server中Convert函數的用法貼出來。
use CitrixSmartAuditor
select b.Name,COUNT(*) from ICLFile a,server b
where Convert(varchar,StartTime,120) LIKE '2019-08-22%'
and a.ServerID = b.ID
group by b.Name
order by b.Name
