查找两个日期之间的记录,而不在其他地方查

时间:2011-08-08 19:13:59

标签: sql sql-server

我在设置查询的日期边界时遇到问题。

我想要在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' 
    ) 

4 个答案:

答案 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'。在我工作的银行中,它是唯一适用于生产服务器和测试服务器的格式。