我在设置查询的日期边界时遇到问题。
我想要在10/1/2010和2010年12月31日之间创建记录,但在2011日历年中没有记录(活动)。
where INV.Date_Imported BETWEEN '10/1/2010' AND '12/31/2010'
AND INV.RecID NOT IN (
SELECT RecID
FROM [VW_Invoice_All]
WHERE Date_Imported > '1/1/2011'
)
答案 0 :(得分:2)
我看到的唯一明显问题是您的Date_Imported
行。如果您希望在NOT IN
查询中包含1/1/2011,则需要将查询更改为
WHERE Date_Imported >= '1/1/2011'
BETWEEN
已经具有包容性,这就是您的目标。
答案 1 :(得分:0)
您的日期没有任何时间,但如果它们是DATETIME
列,那么这可能很重要。我可能会用:
WHERE
INV.Date_Imported >= '10/1/2010' AND
INV.Date_Imported < '1/1/2011' AND
NOT EXISTS (
SELECT *
FROM [VW_Invoice_All] I2
WHERE
I2.RecID = INV.RecID AND
I2.Date_Imported >= '1/1/2011')
(EXISTS
可能会提供比IN
查询更好的性能,但同时测试它们。)
答案 2 :(得分:0)
正如gtcompscientist所说:
BETWEEN已经具有包容性......
所以你只需要:
WHERE INV.Date_Imported BETWEEN '2010-10-01 00:00:00' AND '2010-12-31 23:59:59'
为避免任何疑问,使用YYYY-MM-DD HH:mm:ss格式意味着您无需担心区域设置(英国日期为DD-MM-YYYY,而美国为MM-DD-YYYY但YYYY-MM-DD格式在两个区域都被解释相同。)
增加时间(HH:mm:ss)可确保您包括2010-12-31全部,即00:00:00至23:59:59。
答案 3 :(得分:0)
根据我的经验,最安全的日期格式是'yyyymmdd'。在我工作的银行中,它是唯一适用于生产服务器和测试服务器的格式。