我正在 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
我试图找出为什么BETWEEN
使用第一个运算符时,运算符不包含 2010 年 12 月 31 日的 24 个期间的所有行SELECT
, 多于。为什么需要将明确的时间添加到SELECT
语句如第二个修改后的语句中所示,以使其提取正确的行数?
是因为方式的原因吗TRANDATE
定义为“DATETIME
"?
基于这一发现,我认为将不得不遍历所有这些旧代码,因为这些BETWEEN
操作员遍布在这个旧系统中,看起来它没有正确提取所有数据。我只是想先从一些人那里得到澄清。谢谢!
日期是一个时间点,而不是一个时间跨度。
'12/31/2010'
也是一个要点。也就是说,现在是 12 月 31 日午夜。
此后发生的所有事情都将被忽略。
这正是您想要的行为(即使您还没有意识到)。
不要认为当您选择省略时间部分时,它会被神奇地假定为"any"
。这将是"all zeroes"
,即午夜。
如果您想在查询中包含一整天而不必指定23:59:59
(顺便说一句,不包括当天的最后一秒 https://stackoverflow.com/questions/5434001/t-sql-between-dates-confusion#comment6152634_5434001, 在。。之间moment 23:59:59
当日和moment 00:00:00
第二天),您可以通过使用严格的不等式来做到这一点(>
, <
)以您的第一个时间点为界don't want:
WHERE TRANDATE >='12/01/2010 00:00:00' and TRANDATE < '01/01/2011'
或通过比较转换为的日期值DATE
:
WHERE CAST(TRANDATE AS DATE) between '12/01/2010' and '12/31/2010'
(可以将这种类型的演员放入WHERE
条款,它是可控制的 https://dba.stackexchange.com/q/34047/5203).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)