0

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

以下是我的查询。它工作得很好,只是它没有得到当月的第一天。(如果是 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

知道如何将本月的第一天包含在其中吗?

4

2 回答 2

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日期范围查询;始终使用开放式范围:

于 2012-08-06T20:29:18.240 回答
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)
于 2012-08-06T20:14:30.257 回答