0

日付 (smalldatetime) を含むイベントのテーブルがあります。リマインダーを送信する間隔(int) (日前)の表がありますDATEADD(D, *interval*, GETDATE())

今日リマインダーを送信する必要があるすべてのイベントを取得するための SQL ステートメントを作成しようとしています ( GETDATE()DATEADD 関数に基づいています。これは、最初にすべての間隔を取得し、SQL をループで実行して、各間隔を次のように渡す代わりに、 DATEADD 関数へのパラメーター。

これを行う方法はありますか?

**dbo.events**
id (int) PK
date (smalldatetime)
customerID (int)

**dbo.intervals**
id (int) PK
daysBefore (int)
customerID (int)
4

3 に答える 3

3

はい。自分で試してみるべきだった

create table t(val int);
insert into t values(4),(7),(10)

select DATEADD(D, val, GETDATE()) from t

SQLフィドル

于 2012-10-21T20:34:58.520 に答える
1

それがどのように可能かを示してくれてありがとう。もっと効率的な方法がない限り、これがSQLの書き方だと思いますか?

SELECT *
FROM events
WHERE date IN (
    SELECT DATEADD(D,daysBefore,DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())))
    FROM interval
    WHERE events.customerID = customerID);

SQLフィドル

于 2012-10-21T20:42:26.080 に答える
1

答えはイエスです。提供された情報が不足しているため、このクエリを作成できません。しかし、はい、できます。

次の例を見てください。

MyTable:
ID    Interval    Date
1     1           10-10-2001

SELECT ID, DATEADD(D, Interval, GETDATE()) AS NewDate FROM MyTable


SELECT e.*
FROM [events] e
INNER JOIN [interval] i on e.customerID = i.customerID
WHERE e.date = DATEADD(D, i.daysBefore, 
                   DATEADD(D, 0, 
                       DATEDIFF(D, 0, GETDATE())))
于 2012-10-21T20:33:51.377 に答える