是否可以使用另一个表中的值作为DATEADD函数中的间隔?

时间:2012-10-21 20:27:54

标签: sql sql-server case where dateadd

我有一个包含日期(smalldatetime)的事件表。 我有一个间隔(int)(前几天)的表格,用于发送提醒的时间 - DATEADD(D, *interval*, GETDATE())

我正在尝试编写一个SQL语句来获取今天应该发送提醒的所有事件(基于来自DATEADD函数的GETDATE()。这不是我首先获取所有间隔并运行SQL在循环中,将每个间隔作为参数传递给DATEADD函数。

我有什么想法吗?

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

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

3 个答案:

答案 0 :(得分:3)

是。你应该自己尝试一下

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

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

SQLFiddle

答案 1 :(得分: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())))

答案 2 :(得分: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