正如已經提到過的,您需要使用正確的日期類型才能正常運行。
select *
from student
where convert(date,LEFT(dob,8)) between '20150820' and '20150828'
旁註:你沒有明確你的兩個日期從文本轉換,因爲這隻要將隱式地使用一個明確的日期表示進行,即ISO標準「YYYYMMDD」或「YYYY-MM -DD」。當然,如果你在變量中保存值,則使用date | datetime數據類型
declare @startdate date
declare @enddate date
select *
from student
where convert(date,LEFT(dob,8)) between @startdate and @enddate
旁註2:你的桌子上DOB列執行的功能會阻止該列的任何索引被用來實現其全部潛力的執行計劃,並可能導致較慢的執行,如果可以的話,定義表格dob列的正確數據類型,或者如果您的性能是真正的問題,請使用持久性計算列或實例化視圖。旁註3:如果您需要維護數據中的時間部分,即出生日期和時間,請使用以下內容確保捕獲所有記錄;
select *
from student
where
convert(date,LEFT(dob,8)) >= '20150820'
and convert(date,LEFT(dob,8)) < dateadd(d,1,'20150828')
你做字符串比較不日期轉換爲日期,應該工作。未來請不要將日期保存爲'VARCHAR(14)' – lad2025
更改列日期類型! – jarlh
沒有什麼奇怪的事情發生。如果將日期存儲爲varchar,則不能指望它的行爲與日期類似。 – Fred