根据今天的日期运行查询

时间:2012-08-06 19:51:42

标签: sql sql-server sql-server-2000 getdate

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

以下是我的查询。它工作得很好,除了没有获得本月1日。 (如果是第15次或第1次)

例如:如果我在7/1/12运行查询,它应该发送结果为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

知道如何获得本月的第一个月吗?

2 个答案:

答案 0 :(得分:1)

恕我直言,试图在查询中计算这些开始和结束范围没有多大优势。可能更容易通过将其分离来可视化发生的事情:

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;

远离BETWEEN日期范围查询;总是使用开放式范围:

答案 1 :(得分:0)

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

-- 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)