0

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

そこに月の最初を含める方法はありますか?

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 に答える