我有一个包含invoiceNumber,CustNum,Datetime和Grand_total
的表我想在此示例中的一组日期之间拉出所有交易,所有交易都在2014年4月10日到2014年4月23日之间。我正在使用:
SELECT Invoice_number
,CustNum
,DATETIME
,Grand_Total
FROM invoice_totals
WHERE custnum = '10014877'
AND DATETIME BETWEEN '2014-04-10'
AND '2014-04-23'
ORDER BY DATETIME DESC
我刚刚意识到4/23上是否有任何日期表明它们没有显示出来..我尝试使用以下代码:
WHERE custnum = '10014877'
AND DATETIME >= '2014-04-10' AND DATETIME <='2014-04-23'
但它仍然给我相同的结果(忽略4/23发生的任何交易) 拉起的最后记录的日期时间戳为2014-04-22 12:26:08.000。在我试图包含的23'ed上有 ARE 2个交易。
非常感谢。
答案 0 :(得分:2)
部分:
AND DATETIME <='2014-04-23'
实际上是(根据TSQL):
AND DATETIME <='2014-04-23 00:00:000'
所以你从午夜开始查询并错过了23日00:01到23:59的所有交易。
尝试:
AND DATETIME <='2014-04-23 23:59:999'
或者
AND DATETIME < '2014-04-24'
两者都应该包括23日当天的所有交易。
答案 1 :(得分:1)
如果您正在使用连续数据(例如日期时间),通常最好切换到使用半开放时间间隔 - 包含开始日期和独占结束日期。独家结束日期通常更容易计算:
WHERE custnum = '10014877'
AND DATETIME >= '20140410' AND DATETIME <'20140424'
我也改用了一种安全,明确的日期格式。
替代方案,使用<=
或BETWEEN
(这只是一对>=
和<=
比较的简写,因此您的两个查询相同)需要< em>包含结束日期。这取决于您使用的确切数据类型可能是2014-04-23T23:59:59.997
或2014-04-23T23:59:59.9999
或任何其他可能性 - 如果您弄错了并且过度指定了值,那么它将被舍入为20140424
,然后包容性比较不正确。
即使你今天弄明白,如果列的数据类型稍后更改,也很难找到这种模式的所有用法。
答案 2 :(得分:0)
BETWEEN
是包容性的。
但是,我猜测您的(名称不详的)DATETIME
字段的类型是.. DATETIME ,因此在比较中,日期'2014-04-23'
转换为 DATETIME ,如下所示:'2014-04-23:00:000'
。因此,DATETIME
上04-23
大于第一时刻的所有记录都会被拒绝。