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

SQLFiddle

于 2012-10-21T20:34:58.520 回答
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 回答
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);

SQLFiddle

于 2012-10-21T20:42:26.080 回答