我需要的是在今天的日期之后的下一个特定日期(星期一,星期二,星期三……)的日期.
允许用户选择他们想要的日期,并将其作为int存储在表中. “下周二给我打电话(3)”
Sunday = 1 Monday = 2 Tuesday = 3 ...
所以我的桌子看起来像这样.
UserID,NextDayID
我想出的是:
select dateadd(dd,(7 - datepart(dw,GETDATE()) + NextDayID ) % 7,getdate())
它似乎工作,并将返回今天的日期,如果你要求今天的任何一天,如果需要我可以添加一周.
我想知道的是,这是一个很好的解决方案还是我缺少的东西?
解决方法
1)您的解决方案使用非确定性函数:datepart(dw …).由于这个方面,更改DATEFIRST设置将产生不同的结果.例如,你应该尝试:
SET DATEFIRST 7; your solution;
接着
SET DATEFIRST 1; your solution;
2)以下解决方案独立于DATEFIRST / LANGUAGE设置:
DECLARE @NextDayID INT = 0 -- 0=Mon,1=Tue,2 = Wed,...,5=Sat,6=Sun SELECT DATEADD(DAY,(DATEDIFF(DAY,@NextDayID,GETDATE()) / 7) * 7 + 7,@NextDayID) AS NextDay
结果:
NextDay ----------------------- 2013-09-23 00:00:00.000
>第0天= 19000101 =周一
>第1天= 19000102 =星期二
>第2天= 19000103 =周三
…
>第5天= 19000106 =周六
>第6天= 19000107 =太阳
因此,将INT值0转换为DATETIME会得到19000101.
如果你想在下周三找到,那么你应该从第2天(19000103 /周三)开始,计算第2天和当天(20130921; 41534天)之间的天数,除以7(以获得整周数; 5933周数,多次乘以7(41531次;为了得到天数 – 从第一个星期三/ 19000103到最后一个星期三之间的整周),然后再加7天(一周; 41538天;为了得到星期三) ).将此号码(41538天)添加到开始日期:19000103.
注意:我目前的日期是20130921.
编辑#1:
DECLARE @NextDayID INT; SET @NextDayID = 1; -- Next Sunday SELECT DATEADD(DAY,((@NextDayID + 5) % 7),((@NextDayID + 5) % 7)) AS NextDay
结果:
NextDay ----------------------- 2013-09-29 00:00:00.000
注意:我目前的日期是20130923.