2013-08-22 49 views
-2

我的問題可能是所有關於日期格式在SELECT選擇日期之間幾乎工作

在ASP文件我打開一個ADO記錄集想要取回落在date1 (08/15/2013)date2 (08/22/2013)(即前7天從今天的日期。)

SELECT並檢索相應之間的MS SQL表的行2013行,但也檢索行回到08/15/2012。

這裏是SELECT:

oRS.Source = "SELECT * FROM aTable WHERE entry_Date BETWEEN '" & resultLowerDate & "' AND '" & resultCurrentDate & "' AND entry_Status <> 'INACTIVE'" 

resultLowerDate = 2013年8月15日和resultCurrentDate = 2013年8月22日。

表被設置爲與resultCurrentDate =「2013年8月22日」如下:至於爲什麼INITIAL 08/15/2012一行滿足SELECT查詢其他行一起選擇被

entry_Status entry_Date (varchar) LastName FirstName SELECT Result 
INITIAL  08/15/2012  Smith  Jim   YES 
INACTIVE 08/21/2012  Green  Tom   no 
INITIAL  08/22/2013  Jones  Mary   yes 
FOLLOWUP 08/22/2013  Jones  Mary   yes 
FOLLOWUP 08/22/2013  Brown  Sally   yes 
FOLLOWUP 08/22/2013  Smith  Jim   yes 

有什麼想法?

+1

WHY是ENTRY_DATE一個varchar ??? –

+7

如果@AaronBertrand不會插入他自己的文章,我會的。 **請**閱讀[選擇錯誤的數據類型](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data- type.aspx)和[錯誤處理日期/範圍查詢](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries的.aspx)。閱讀整個踢球系列的壞習慣可能是值得的。他們都是現貨,如果每個人都閱讀它們,那麼Stackoverflow上的問題就會少得多! – GarethD

回答

3

停止在VARCHAR列存儲日期!並停止連接字符串,使用合適的參數。

對不起,我們每天都會收到多個問題,人們使用錯誤的數據類型來處理一些未知的或可能是愚蠢的原因,而這些都是它帶來的問題。

這裏的問題是,你在比較字符串。嘗試:

"... WHERE CONVERT(DATETIME, entry_date, 101)" & _ 
    " >= CONVERT(DATETIME, '" & resultLowerDate & "', 101)" & _ 
" AND CONVERT(DATETIME, entry_date, 101)" & _ 
    " < DATEADD(DAY, 1, CONVERT(DATETIME, '" & resultCurrentDate & "', 101))" 

或者更好的是,設置resultLowerDate和resultUpperDate到年月日的格式,那麼你可以說:

"... WHERE CONVERT(DATETIME, entry_date, 101) >= '" & resultLowerDate & "'" & _ 
" AND CONVERT(DATETIME, entry_date, 101) < DATEADD(DAY, 1, '" & resultCurrentDate & "'" 

請注意,我用一個開放的範圍(> =和<)代替BETWEEN,以防萬一時間滑入你的VARCHAR列。

另請注意,此查詢可能因爲垃圾進入您的列而失敗。它可以,因爲你選擇了錯誤的數據類型。我真正的建議是修復表格並使用DATEDATETIME列。

+0

我在這個問題上已經有一段時間了。但是,今天我已經審查了你的建議並採納了你的建議。我已將相應的表格列修改爲日期和時間類型。 – user2033850

+0

@ user2033850太棒了!遲到總比不到好。 :-) –

0

事實上,您的entry_Date列是一個varchar字段,而不是實際的日期是問題。如果您在選擇期間將其轉換爲日期時間,則會得到您期望的結果。

select * 
from aTable 
where cast(entry_Date as datetime) between '08/15/2013' and '08/22/2013' 

Sql Fiddle link

+0

如果用戶使用SET LANGUAGE BRITISH或SET DATEFORMAT DMY運行,CAST將無法正常工作。您應該使用樣式轉換,並且任何未明確轉換的字符串都應該採用ISO格式(YYYYMMDD)。 –

+0

這是真的,我通常會做這樣的事情:cast(convert(varchar,entry_Date,101)as datetime),但是在這個例子中省略了它。 – beercodebeer

+1

如果entry_date已經是一個字符串,轉換爲varchar([沒有長度???](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring -varchar-without-length.aspx))以101的樣式不做任何事情。 (如果語言是英國的,或者dateformat是DMT,那麼表達仍然失敗。)爲什麼不只是'convert(datetime,entry_Date,101)'? –

相關問題