select 用户的mail地址列表
from TB
where startdate <@i and enddate>@i 
and datepart(dd,dateadd(dd,-7,enddate))=datepart(dd,@i)
--@i 就是当天做个作业每天检查一下即可。

解决方案 »

  1.   

    select * from dkinfo 
    where BeginDate <= GETDATE() 
          and EndDate >= GETDATE()
          and DATEPART(day,BeginDate)= datepart(day,getdate()) +8
      

  2.   

    我有新建了一个LastSendDate的字段,用来记录已发送日期,好不重复发送,但还是思路不清楚,控制不了
      

  3.   


    或者这样,建立一个要发送的消息表,里面先把结果存进去,然后通知了,就把记录删除,或者做一个删除表标记:
    ;with t
    as
    (
    select 1 as numberunion allselect number + 1
    from t
    where number <100
    ),tb
    as
    (
    select '2013-11-18' BeginDate,'2014-11-17' EndDate
    )select dateadd(day,-8,dateadd(month,number,BeginDate)) as 通知日期
    from tb
    inner join t
            on 1 = 1
    where dateadd(day,-8,dateadd(month,number,BeginDate)) <=EndDate
    /*
    通知日期
    2013-12-10 00:00:00.000
    2014-01-10 00:00:00.000
    2014-02-10 00:00:00.000
    2014-03-10 00:00:00.000
    2014-04-10 00:00:00.000
    2014-05-10 00:00:00.000
    2014-06-10 00:00:00.000
    2014-07-10 00:00:00.000
    2014-08-10 00:00:00.000
    2014-09-10 00:00:00.000
    2014-10-10 00:00:00.000
    2014-11-10 00:00:00.000
    */
      

  4.   


    或者这样,建立一个要发送的消息表,里面先把结果存进去,然后通知了,就把记录删除,或者做一个删除表标记:
    ;with t
    as
    (
    select 1 as numberunion allselect number + 1
    from t
    where number <100
    ),tb
    as
    (
    select '2013-11-18' BeginDate,'2014-11-17' EndDate
    )select dateadd(day,-8,dateadd(month,number,BeginDate)) as 通知日期
    from tb
    inner join t
            on 1 = 1
    where dateadd(day,-8,dateadd(month,number,BeginDate)) <=EndDate
    /*
    通知日期
    2013-12-10 00:00:00.000
    2014-01-10 00:00:00.000
    2014-02-10 00:00:00.000
    2014-03-10 00:00:00.000
    2014-04-10 00:00:00.000
    2014-05-10 00:00:00.000
    2014-06-10 00:00:00.000
    2014-07-10 00:00:00.000
    2014-08-10 00:00:00.000
    2014-09-10 00:00:00.000
    2014-10-10 00:00:00.000
    2014-11-10 00:00:00.000
    */
    一定要建一个表么,建一个字段不行吗?
      

  5.   


    或者这样,建立一个要发送的消息表,里面先把结果存进去,然后通知了,就把记录删除,或者做一个删除表标记:
    ;with t
    as
    (
    select 1 as numberunion allselect number + 1
    from t
    where number <100
    ),tb
    as
    (
    select '2013-11-18' BeginDate,'2014-11-17' EndDate
    )select dateadd(day,-8,dateadd(month,number,BeginDate)) as 通知日期
    from tb
    inner join t
            on 1 = 1
    where dateadd(day,-8,dateadd(month,number,BeginDate)) <=EndDate
    /*
    通知日期
    2013-12-10 00:00:00.000
    2014-01-10 00:00:00.000
    2014-02-10 00:00:00.000
    2014-03-10 00:00:00.000
    2014-04-10 00:00:00.000
    2014-05-10 00:00:00.000
    2014-06-10 00:00:00.000
    2014-07-10 00:00:00.000
    2014-08-10 00:00:00.000
    2014-09-10 00:00:00.000
    2014-10-10 00:00:00.000
    2014-11-10 00:00:00.000
    */
    一定要建一个表么,建一个字段不行吗?加个字段好像不行,你想,加一个字段,表示这个月已经发送了,那么这个月就不发送了,但是什么时候再开启这个标志呢?这也是个麻烦的问题
      

  6.   

    楼上的方案都没仔细看,你这个需求在我看来应该新建一张提醒任务表。当业务表中插入或更新数据时,去提醒任务表中更新提醒任务。
    以你那条数据举例
    2013-11-18至 2014-11-17
    一条这样的数据应该在提醒任务表中对应2013-12-10,2014-01-10,2014-02-10,2014-03-10…… 2014-11-1这样的N条数据,数据中记录对应的业务数据ID,当业务数据的开始截止日期发生变更时同步更新提醒任务表。有了这张表后就很简单了,写个作业或做个小程序,每天查提醒任务表有没有当天的提醒任务,完成提醒后把任务状态置为已完成,或移到提醒历史表中。