1

状況:

ユーザーは、日付フィールド (DateOpened) を含むケース レコードを作成し、ケースがクローズされるまで 30 日ごとにクライアントにフォローアップを送信したいと考えています。ユーザーはクエリを定期的に (おそらく毎週) 実行し、「開始日」と「終了日」の日付範囲を指定して、レコードが 30 日の倍数に収まる期間を指定します。

リクエスト:

ユーザーが指定した日付範囲に、DateOpened の日付から 30 日の倍数であるレコードが含まれているレコードを識別する方法が必要です。

更新 これは、昨夜、三流のテレビ番組を見ているときに突然思いついたことです!!!

SELECT 
.... 
FROM 
....
WHERE
(CAST((DATEDIFF(dd, Invoice.DateOpened @EndDate)/30) AS INT) - CAST((DATEDIFF(dd, Invoice.DateOpened, @StartDate)/30) AS INT)) >=1 
OR DATEDIFF(dd, Invoice.DateOpened, @StartDate) % 30 = 0 --this line to capture valid records but where From and To dates are the same 
4

2 に答える 2

0

これは Microsoft SQL ですか? これはエクスプレス版ですか?Express でない限り、データベースに対して実行できるタスクをスケジュールできる SQL Agent サービスの使用を検討することをお勧めします。記録が 30 日に達したら、記録をどうしたいですか?

于 2012-10-02T03:17:46.607 に答える
0

DATEDIFF 関数を使用して、日付の差を日数で計算できます。モジュラス (%) 演算子を使用して、除算の「剰余」を取得できます。2つを組み合わせると、次のようになります。

SELECT
    ....
FROM
    ....
WHERE
    --In MS T-SQL, BETWEEN is inclusive.
    DateOpened BETWEEN @UserSuppliedFromDate AND @UserSuppliedToDate
    AND DATEDIFF(dd, DateOpened, getdate()) % 30 = 0

これにより、望ましい結果が得られるはずです。

編集 (この例を MSSQL で試してください):

DECLARE @Table TABLE
(
    ID integer,
    DateOpened datetime
)

DECLARE @FromDate as datetime = '1/1/2012'
DECLARE @ToDate as datetime = '12/31/2012'

INSERT INTO @Table VALUES (0, '1/1/1982')
INSERT INTO @Table values (1, '1/1/2012')
INSERT INTO @Table VALUES (2, '2/17/2012')
INSERT INTO @Table VALUES (3, '3/16/2012')
INSERT INTO @Table VALUES (4, '4/16/2012')
INSERT INTO @Table VALUES (5, '5/28/2012')
INSERT INTO @Table VALUES (6, '1/31/2012')
INSERT INTO @Table VALUES (7, '12/12/2013')

DECLARE @DateLoop as datetime
DECLARE @ResultIDs as table ( ID integer, DateLoopAtTheTime datetime, DaysDifference integer )

--Initialize to lowest possible value
SELECT @DateLoop = @FromDate

--Loop until we hit the maximum date to check
WHILE @DateLoop <= @ToDate
BEGIN
    INSERT INTO @ResultIDs (ID,DateLoopAtTheTime, DaysDifference)
        SELECT ID, @DateLoop, DATEDIFF(dd,@DateLoop, DateOpened)
        FROM @Table 
        WHERE 
            DATEDIFF(dd,@DateLoop, DateOpened) % 30 = 0
            AND DATEDIFF(dd,@DateLoop,DateOpened) > 0 -- Avoids false positives when @DateLoop and DateOpened are the same
            AND DateOpened <= @ToDate
    SELECT @DateLoop = DATEADD(dd, 1, @DateLoop) -- Increment the iterator
END

SELECT distinct * From @ResultIDs
于 2012-10-02T03:32:38.930 に答える