非常典型的SQL,请高手赐教!
表A(促销活动开始日期:Start<date>,结束日期:End<date>,标志:Title<varchar>),如何实现:根据当前日期判断,自动计算未来5天的状态?日期<Start时Title为'准促销',日期>=Start时Title为‘促销’End的后一天Title为'回报日',End的第二天Title为'终止日',在此后面连续的日期则Title为'无效'。(提示:Start从当前实际日期开始,如存在End小于当前日期的不予考虑.)
情形一: Start='2011-06-09' End='2011-06-11' 时需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 促销 促销 促销 回报 终止
情形二: Start='2011-06-08' End='2011-06-10' 则需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 促销 促销 回报 终止 无效
情形三: Start='2011-06-10' End='2011-06-11' 则需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 准促销 促销 促销 回报 终止
Start和End可同为空或同为不空,当同为空时,所有5天的Title都显示准促销,当不为空时(即为正常有效的日期区间时,则是上面需要实现的SQL。也就是说T+N是一定的,只是日期区间不同,Title显示不同而已.<好像就是这三种情况吧!如还有其它情况存在您可补充!> )
情形一: Start='2011-06-09' End='2011-06-11' 时需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 促销 促销 促销 回报 终止
情形二: Start='2011-06-08' End='2011-06-10' 则需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 促销 促销 回报 终止 无效
情形三: Start='2011-06-10' End='2011-06-11' 则需实现:
T+N: T+0[6.9] T+1[6.10] T+2[6.11] T+3[6.12] T+4[6.13]
Title: 准促销 促销 促销 回报 终止
Start和End可同为空或同为不空,当同为空时,所有5天的Title都显示准促销,当不为空时(即为正常有效的日期区间时,则是上面需要实现的SQL。也就是说T+N是一定的,只是日期区间不同,Title显示不同而已.<好像就是这三种情况吧!如还有其它情况存在您可补充!> )
作者: HFC008 发布时间: 2011-06-09
试试下面的,你可以更改系统日期看效果.
SQL code
SQL code
create table tb(start datetime,[end] datetime, title as (case when start>getdate() then '准促销' when start<=getdate() and [end]>=getdate() then '促销' when datediff(d,[end],getdate())<2 then '回报日' when datediff(d,[end],getdate())<3 then '终止日' when datediff(d,[end],getdate())>=3 then '无效' end) ) go insert into tb(start,[end]) select '2011-06-09','2011-06-11' union all select '2011-06-08','2011-06-10' union all select '2011-06-10','2011-06-11' go select * from tb /* start end title ----------------------- ----------------------- ------ 2011-06-09 00:00:00.000 2011-06-11 00:00:00.000 促销 2011-06-08 00:00:00.000 2011-06-10 00:00:00.000 促销 2011-06-10 00:00:00.000 2011-06-11 00:00:00.000 准促销 (3 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-09
日期为空,则没法计算 5 天是从什么时候算起,因此似乎也应视为无效.
作者: qianjin036a 发布时间: 2011-06-09
一:楼上(qianjin036a)貌似只显示了一天的啊,我用的 T=CASE WHEN,感觉太麻烦, 例如:Title =CASE WHEN start IS NULL THEN '准促销'... ,每个条件都要显示5天(5列)啊! 二.5天从当前实际日期算起。(如:今天:2011-06-09,所以上面的T+N,是从6.9开始算,明天6.10则为第一天.依此算)
作者: HFC008 发布时间: 2011-06-09
要这样?
SQL code
SQL code
create table tb(start datetime,[end] datetime) insert into tb select '2011-06-09','2011-06-11' union all select '2011-06-08','2011-06-10' union all select '2011-06-10','2011-06-11' go select *, (case when start>getdate() then '准促销' when start<=getdate() and [end]>=getdate() then '促销' when datediff(d,[end],getdate())<2 then '回报日' when datediff(d,[end],getdate())<3 then '终止日' when datediff(d,[end],getdate())>=3 then '无效' end) as [T+0], (case when start>dateadd(d,1,getdate()) then '准促销' when start<=dateadd(d,1,getdate()) and [end]>=dateadd(d,1,getdate()) then '促销' when datediff(d,[end],dateadd(d,1,getdate()))<2 then '回报日' when datediff(d,[end],dateadd(d,1,getdate()))<3 then '终止日' when datediff(d,[end],dateadd(d,1,getdate()))>=3 then '无效' end) as [T+1], (case when start>dateadd(d,2,getdate()) then '准促销' when start<=dateadd(d,2,getdate()) and [end]>=dateadd(d,2,getdate()) then '促销' when datediff(d,[end],dateadd(d,2,getdate()))<2 then '回报日' when datediff(d,[end],dateadd(d,2,getdate()))<3 then '终止日' when datediff(d,[end],dateadd(d,2,getdate()))>=3 then '无效' end) as [T+2], (case when start>dateadd(d,3,getdate()) then '准促销' when start<=dateadd(d,3,getdate()) and [end]>=dateadd(d,3,getdate()) then '促销' when datediff(d,[end],dateadd(d,3,getdate()))<2 then '回报日' when datediff(d,[end],dateadd(d,3,getdate()))<3 then '终止日' when datediff(d,[end],dateadd(d,3,getdate()))>=3 then '无效' end) as [T+3], (case when start>dateadd(d,4,getdate()) then '准促销' when start<=dateadd(d,4,getdate()) and [end]>=dateadd(d,4,getdate()) then '促销' when datediff(d,[end],dateadd(d,4,getdate()))<2 then '回报日' when datediff(d,[end],dateadd(d,4,getdate()))<3 then '终止日' when datediff(d,[end],dateadd(d,4,getdate()))>=3 then '无效' end) as [T+4] from tb /* start end T+0 T+1 T+2 T+3 T+4 ----------------------- ----------------------- ------ ------ ------ ------ ------ 2011-06-09 00:00:00.000 2011-06-11 00:00:00.000 促销 促销 回报日 回报日 终止日 2011-06-08 00:00:00.000 2011-06-10 00:00:00.000 促销 回报日 回报日 终止日 无效 2011-06-10 00:00:00.000 2011-06-11 00:00:00.000 准促销 促销 回报日 回报日 终止日 (3 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-09
恩,是您这样的意思。好像有些瑕疵:因为‘回报日’和‘终止日’在每行里[每个起止时间段]各只会出现一次['准促销'和'促销'才可能会出现多次]。
(PS:另外:好像可以在每个判断前首先加上:WHEN start IS NULL THEN '准促销' .)
(PS:另外:好像可以在每个判断前首先加上:WHEN start IS NULL THEN '准促销' .)
作者: HFC008 发布时间: 2011-06-09
晚安,明天上午结贴.
作者: HFC008 发布时间: 2011-06-09
SQL code
create table tb(start datetime,[end] datetime) insert into tb select '2011-06-09','2011-06-11' union all select '2011-06-08','2011-06-10' union all select '2011-06-10','2011-06-11' go declare @dt datetime set @dt=convert(varchar(10),getdate(),120) select *, (case when start>@dt then '准促销' when start<=@dt and [end]>=@dt then '促销' when datediff(d,[end],@dt)<=1 then '回报日' when datediff(d,[end],@dt)<=2 then '终止日' when datediff(d,[end],@dt)>2 then '无效' end) as [T+0], (case when start>dateadd(d,1,@dt) then '准促销' when start<=dateadd(d,1,@dt) and [end]>=dateadd(d,1,@dt) then '促销' when datediff(d,[end],dateadd(d,1,@dt))<=1 then '回报日' when datediff(d,[end],dateadd(d,1,@dt))<=2 then '终止日' when datediff(d,[end],dateadd(d,1,@dt))>2 then '无效' end) as [T+1], (case when start>dateadd(d,2,@dt) then '准促销' when start<=dateadd(d,2,@dt) and [end]>=dateadd(d,2,@dt) then '促销' when datediff(d,[end],dateadd(d,2,@dt))<=1 then '回报日' when datediff(d,[end],dateadd(d,2,@dt))<=2 then '终止日' when datediff(d,[end],dateadd(d,2,@dt))>2 then '无效' end) as [T+2], (case when start>dateadd(d,3,@dt) then '准促销' when start<=dateadd(d,3,@dt) and [end]>=dateadd(d,3,@dt) then '促销' when datediff(d,[end],dateadd(d,3,@dt))<=1 then '回报日' when datediff(d,[end],dateadd(d,3,@dt))<=2 then '终止日' when datediff(d,[end],dateadd(d,3,@dt))>2 then '无效' end) as [T+3], (case when start>dateadd(d,4,@dt) then '准促销' when start<=dateadd(d,4,@dt) and [end]>=dateadd(d,4,@dt) then '促销' when datediff(d,[end],dateadd(d,4,@dt))<=1 then '回报日' when datediff(d,[end],dateadd(d,4,@dt))<=2 then '终止日' when datediff(d,[end],dateadd(d,4,@dt))>2 then '无效' end) as [T+4] from tb /* start end T+0 T+1 T+2 T+3 T+4 ----------------------- ----------------------- ------ ------ ------ ------ ------ 2011-06-09 00:00:00.000 2011-06-11 00:00:00.000 促销 促销 促销 回报日 终止日 2011-06-08 00:00:00.000 2011-06-10 00:00:00.000 促销 促销 回报日 终止日 无效 2011-06-10 00:00:00.000 2011-06-11 00:00:00.000 准促销 促销 促销 回报日 终止日 (3 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-09