我正在制作一个使用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
知道如何获得本月的第一个月吗?
答案 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)