2015-04-30 11 views
6

我使用SQL服務器2014年,我嘗試以下方法查詢到在同一個表中的兩個日期之間選擇,數據類型爲nvarchar,我執行下面的查詢,它只是表明我三行這樣('30/03/2015','30/04/2015','30/04/2015'),但在現實中有('29/02/2015','30/03/2015','31/04/2015','30/04/2015','30/04/2015')爲什麼我在同一張表中的兩個日期之間的選擇不起作用?

select RegisteredDate 
from Student 
where Student.RegisteredDate between convert(nvarchar, '30/01/2014', 103) 
    and convert(nvarchar, '30/04/2015', 103) 
+0

如何被格式化的日期在你的桌子? –

+3

這就是爲什麼你不應該把日期存儲爲nvarchar。你確實不需要在這裏允許unicode字符。 :S當您使用正確的數據類型時,這種類型的問題會自行解決。 –

+1

@MarkKram你是什麼意思?RegisteredDate數據類型是nvarchar –

回答

2

正如我已閱讀其他答案和評論,我可以推薦你首先將「registeredDate」的數據類型從「nvarchar」更改爲「date」。下面的代碼是你所需要的

select RegisteredDate 
from Student 
where Student.RegisteredDate between '2014-01-30' and '2015-04-30' 

你會不會需要任何的轉換其次使用這個標準「YYYY-MM-DD」,這是我怎麼做我自己

3

演員反過來,你是比較字符串其他方式:

select RegisteredDate from Student 
where convert(date, Student.RegisteredDate, 103) between '20140130' and '20150430' 

事實是,保存爲字符串的日期被排序爲:

'29/02/2015', 
'30/03/2015', 
'30/04/2015', 
'30/04/2015', 
'31/04/2015' 

現在想象一下你會在哪裏添加過濾器值?

'29/02/2015', 

'30/01/2014' --start date 

/-------------\ 
|'30/03/2015',| 
|'30/04/2015',| 
|'30/04/2015',| 
\-------------/ 

'30/04/2015' --end date 

'31/04/2015' 

所以between會返回你這三行。 此外,您還有數據29/02/2015。在2015二月在28結束(您已在表中有不正確的數據)。如果您選擇正確的類型,您將永遠無法插入此類值。因此得出的結論是:

爲您的數據使用適當的數據類型!

+1

它給了我這個錯誤 Msg 241,Level 16,State 1,Line 1 從字符串轉換日期和/或時間時轉換失敗。 –

+1

比較字符串將從左側開始按字母順序使用char by char。例如:20/01/1302將在01/12/4016之後,因爲「2」字符在「1」字符之後。 – borjab

+1

@Giorgi Nakeuri,但在數據庫中沒有這樣組織(20150430)其組織(30/04/2015) –

1

嘗試將您的字符串轉換爲日期,而不是將表中的所有日期轉換爲字符串。

您正在將表中的所有記錄轉換爲字符串,並且可能有數百萬個記錄。這樣,不僅您的表現會更好,而且更重要的是您會將它們與日期進行比較,而不是String。

SELECT RegisteredDate 
    FROM Student 
WHERE Student.RegisteredDate BETWEEN Convert(Date, '30/01/2014',103) AND Convert(Date, '30/04/2015', 103) 

正如我在評論中說,一個字符串比較 - 陸續從左邊開始使用字母順序一個字符。例如:20/01/1302將在01/12/4016之後,因爲「2」字符在ASCII中的「1」字符之後。

更新:將Student.RegisteredDate轉換爲日期,如果它仍然處於nvarchar類型。如果可以的話,我建議你改變類型。如果你不這樣做,它可能是錯誤和性能問題的根源。

SQL Server 2014將字符串自動轉換爲日期轉換,但僅在需要時進行轉換。比較'30/04/2015'字符串和nvarchar只是一個字符串比較。

+0

你能否告訴我什麼是(to_Date)? –

+1

'30/01/2014'只是一個字符串類型,如'Helloworld'和'FooBar'。他們沒有任何日期含義。 日期類型針對數據庫進行了優化,並進行了一些檢查,因此您不會找到'31/02/2015'或'33/13'1233'。 To_date只會改變類型 請參閱例如:http://www.connectsql.com/2011/04/sql-server-basics-todate-function-in.html – borjab

+0

@borjab,是不是隻爲oracl? –

相關問題