2015-08-28 81 views
-2

在sql查詢中有這個奇怪的錯誤。運算符之間的Sql查詢的奇怪行爲

查詢是這樣的。

select * from student where dob between '20150820' and '20150828' 

但在數據庫DOB的列是VARCHAR(14),是YYYYMMDDHHMMSS格式,說我的行中的數據是(20150827142545)。如果我火了上面的查詢不應該retrive任何行作爲我在查詢中提到了yyyyMMdd格式,但它回覆了昨天的日期(即20150827112535),並且無法獲得當天日期的記錄(即20150828144532)

爲什麼會發生這種情況?

感謝您的幫助提前

+1

你做字符串比較不日期轉換爲日期,應該工作。未來請不要將日期保存爲'VARCHAR(14)' – lad2025

+2

更改列日期類型! – jarlh

+4

沒有什麼奇怪的事情發生。如果將日期存儲爲varchar,則不能指望它的行爲與日期類似。 – Fred

回答

1

你可以嘗試這樣的:

select * from student 
where convert(date,LEFT(dob,8)) between 
     convert(date'20150820') and convert(date,'20150828')) 

此外,正如其他人評論您需要存儲您的日期作爲Date,而不是varchar在將來避免此類問題。

+0

謝謝.....但我的問題是爲什麼它顯示昨天的日期與我的錯誤查詢記錄?? –

+0

@BhanuChowdary: - 原因可能是因爲'BETWEEN'在SQL Server中是不對稱的,日期被比較爲字符串而不是日期 –

+0

: - 是的..真的。日期被比較爲字符串,但爲什麼以及如何查詢我是這些日期之間的記錄,不包括查詢中指定的日期,甚至字符串都是yyyyMMddhhmmss格式。但在查詢中,我只以yyyyMmdd格式指定了它。它是如何匹配指定日期之間的記錄的? ? –

0

所有您需要做的是先轉換字符串到目前爲止。

select * 
from student 
where dob between convert(date, '20150820') and convert(date, '20150828') 
1

正如已經提到過的,您需要使用正確的日期類型才能正常運行。

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') 
+1

謝謝愛德華....我知道它可以使用convert函數來完成......但我的問題在於,如果查詢的類型爲varchar,它的行爲如何...爲什麼它會顯示這些日子之間的記錄排除我在查詢中提到的日期.. –

+1

我看到你的問題,我明白當比較字符數據時,它將從最左邊的字符串開始,當字符串長度不等時,較長的字符串被視爲在。這就是爲什麼你的第一次約會出現,第二次約會沒有。換句話說,AB在ABC之前出現,ABC在AC之前出現,數字12之前出現在123和123之前出現在13之前。回到原始數據20150827142545介於20150827 [------]和20150828之間[--- ---],而20150828144532在20150828 [------]之後,因此被排除在結果集之外。 –

+0

Ohhh ...好的,謝謝你,非常感謝.... :) –

0

這是怎麼發生的?

比較從左到右執行,字符順序由正在使用的代碼頁決定。

排序

排序順序指定數據值進行排序的方式,影響 數據比較的結果。數據排序通過排序完成 ,並且可以使用索引進行優化。

https://msdn.microsoft.com/en-us/library/ms143726.aspx