Sql 基于今天运行查询';日期

Sql 基于今天运行查询';日期,sql,sql-server,sql-server-2000,getdate,Sql,Sql Server,Sql Server 2000,Getdate,我正在制作一个使用windows调度器自动运行的程序。我想做的是将程序设置为每月1日和16日运行。如果程序在1号运行。我想运行上个月的查询。。。例如,如果今天是8月1日,我希望它运行7/1/12-7/31/12。如果我在16日运行该程序,我希望它在本月15日之前运行查询。例如,如果是8/16,我希望程序运行8/1/12-8/15/12的查询 下面是我的问题。它工作得很好,除了它没有得到本月1号。(如果是15号或1号) 例如:如果我在2012年7月1日运行查询,它应该会立即发送6/1-6/30的结

我正在制作一个使用windows调度器自动运行的程序。我想做的是将程序设置为每月1日和16日运行。如果程序在1号运行。我想运行上个月的查询。。。例如,如果今天是8月1日,我希望它运行7/1/12-7/31/12。如果我在16日运行该程序,我希望它在本月15日之前运行查询。例如,如果是8/16,我希望程序运行8/1/12-8/15/12的查询

下面是我的问题。它工作得很好,除了它没有得到本月1号。(如果是15号或1号)

例如:如果我在2012年7月1日运行查询,它应该会立即发送6/1-6/30的结果,它显示的是6/2-6/30。如果我运行6/15的查询,它应该运行6/1-6/15。。。它正在运行6/2-6/15

SELECT        
    Store_Number, Invoice_Number, Invoice_Date, Extended_Price, 
    Warranty_Amount, Quantity_Sold, Invoice_Detail_Code
FROM
    Invoice_Detail_Tb
WHERE        
    (Invoice_Date BETWEEN (CASE WHEN datepart(dd, getdate()) = 1 THEN dateadd(mm, - 1, getdate()) ELSE dateadd(dd, - 15, getdate()) END) 
                  AND (CASE WHEN datepart(dd, getdate()) = 1 THEN dateadd(dd, - 1, getdate()) ELSE dateadd(dd, - 1, getdate()) END)) 
    AND (Warranty_Amount > 0) 
    AND (Store_Number = '309')
ORDER BY 
    Store_Number, Invoice_Date

你知道如何把这个月的第一天包括在里面吗?

也许这会让你朝着正确的方向开始:

-- Beginning of this month:
SELECT dateadd(mm, datediff(mm, 0, getdate()), 0)

-- Beginning of previous month:
SELECT dateadd(mm, datediff(mm, 0, getdate()) - 1, 0)

尝试在查询中计算这些开始和结束范围并没有多大好处。通过将其分离出来,可以更容易地可视化正在发生的事情:

DECLARE @sd SMALLDATETIME, @ed SMALLDATETIME;

-- set the start date to the first day of this month
SET @sd = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);

IF DATEPART(DAY, GETDATE()) = 1 THEN
BEGIN
  -- if it's the first, we want last month instead
  SET @sd = DATEADD(M<ONTH, -1, @sd);
END

SET @ed = DATEADD(MONTH, 1, @sd);

SELECT Store_Number, ...etc...
FROM dbo.Invoice_Detail_Tb
WHERE Store_Number ='309' 
AND Invoice_Date >= @sd
AND Invoice_Date < @ed
ORDER BY Store_Number, Invoice_Date;
声明@sd SMALLDATETIME,@ed SMALLDATETIME;
--将开始日期设置为本月的第一天
SET@sd=DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0);
如果DATEPART(DAY,GETDATE())=1,则
开始
--如果是第一次,我们要上个月
设置@sd=DATEADD(M=@sd
和发票日期<@ed
按门店编号、发票日期订购;
对于日期范围查询,请在之间远离
;始终使用开放式范围:


Invoice\u Date
是一个严格的
日期
类型,没有时间信息吗?此外,您可以通过将上限设置为独占的方式简化一些事情(即,
有一个时间戳,但它总是12:00AM,因为它是提取时的数据库快照(总是12:00AM)。