我正在使用SQL Server 2000中的T-SQL,并且我有一个表TRANSACTIONS
,其中有一个日期列TRANDATE
,定义为DateTime,还有其他许多与此问题无关的列。
该表填充了跨越多年的交易。 我遇到了一些困惑我的代码和测试。 有一个简单的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
我试图找出为什么在使用上面的第一个
SELECT
语句时,BETWEEN
运算符不包括2010年12月31日24小时内的所有行。为什么需要将显式小时添加到第二个修改后的语句中的SELECT
语句中才能使其正确地提取出正确数量的行?这是因为
TRANDATE
被定义为"DATETIME
"的方式吗?基于这一发现,我认为我将不得不检查所有旧代码,因为这些
BETWEEN
运算符散布在整个旧系统中,而且似乎没有正确地提取所有数据。我只是想先向一些人澄清一下。谢谢!
between
,而是使用>=
和<
来代替。 - Martin Smith