我與T-SQL的工作在SQL Server 2000和我有有定義爲DateTime的日期列TRANDATE
,這是無關這個問題,許多其他的列中的表TRANSACTIONS
..T-SQL的日期的混亂
該表填充了跨越多年的事務。我遇到了代碼,測試,這讓我感到困惑。有一個簡單的SELECT
,就像這樣:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010' and '12/31/2010' ORDER BY TRANDATE
和它沒有返回兩行數據,我知道是該表。
通過上面的語句,最後一排的迴歸,才能,有一個TRANDATE
的:2010-12-31 00:00:00.000
當我修改的聲明類似下面,我得到了額外的兩行2010年12月是該表:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010 00:00:00' and '12/31/2010 23:59:59' ORDER BY TRANDATE
我試圖找出爲什麼BETWEEN
操作犯規包括在12/31/2010爲24期間,所有行使用第一SELECT
時,上面。爲什麼它需要在第二條修改後的語句中添加明確的小時數(如SELECT
)以使其將正確的行數拉出?
是不是因爲TRANDATE
被定義爲「DATETIME
」?
基於這一發現,我認爲將不得不經歷所有這些舊代碼,因爲這些BETWEEN
運算符在整個這個舊系統中都是散佈的,看起來好像它沒有正確地提取所有數據。我只是想先從一些人身上作出澄清。謝謝!
''12/31/2010 23:59:59''仍然會錯過'2010年12月31日23:59:59'和2010年12月31日23:59:59:997之間的時間在''之間'使用''日期時間使用'> =和<'來代替。 – 2011-03-25 14:55:25
@Martin:謝謝。並感謝所有其他人。特別是@GSerg誰基本上回答了我的問題。 我似乎不能upvote,直到我有15分,這就是爲什麼你都沒有看到任何(從我)。但現在我明白基於每個人的反應。謝謝。我有一些工作要做! :-) – ONDEV 2011-03-25 15:00:39