Sql server 使用CTE在SQL Server 2012中获取连续日期

Sql server 使用CTE在SQL Server 2012中获取连续日期,sql-server,weekday,Sql Server,Weekday,在Microsoft SQL Server中,我必须为一个特定房间指定颜色代码,在两个代码之间交替指定一年的颜色代码。唯一字段是日历的每个单独日期 所以示例行如下所示 weekDay colorName RoomNum 2017-01-01 Blue 100 2017-01-02 Red 100 需要为每周指定颜色代码,从星期一开始到星期天,在两种颜色之间交替,星期一计算为一周的结束。因此,从2017年1月2日星期一开始,我需要以下模式

在Microsoft SQL Server中,我必须为一个特定房间指定颜色代码,在两个代码之间交替指定一年的颜色代码。唯一字段是日历的每个单独日期

所以示例行如下所示

weekDay       colorName   RoomNum
2017-01-01    Blue        100
2017-01-02    Red         100
需要为每周指定颜色代码,从星期一开始到星期天,在两种颜色之间交替,星期一计算为一周的结束。因此,从2017年1月2日星期一开始,我需要以下模式在下一个日历年(即2018年底)继续

2017-01-02    Red         100
2017-01-03    Red         100
2017-01-04    Red         100 
2017-01-05    Red         100
2017-01-06    Red         100
2017-01-07    Red         100
2017-01-08    Red         100
2017-01-09    Blue        100
2017-01-10    Blue        100
2017-01-11    Blue        100 
2017-01-12    Blue        100
2017-01-13    Blue        100
2017-01-14    Blue        100
2017-01-15    Blue        100
2017-01-16    Red         100
.
.
.
我有以下CTE,但它在第一周分配6天,然后每周分配14天,而不是从周一到周日的七天间隔。我做错了什么?谢谢

DECLARE @tableTest TABLE (weekDay datetime, colorName varchar(50), roomNum int);

DEClARE @begindate datetime = '01/02/17';
declare @enddate datetime = '12/31/18';

;with 
 N0 as (SELECT 1 as n UNION ALL SELECT 1)
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2)
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2)
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2)
,N4 as (SELECT 1 as n FROM N3 t1, N3 t2)
,N5 as (SELECT 1 as n FROM N4 t1, N4 t2)
,N6 as (SELECT 1 as n FROM N5 t1, N5 t2)

,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N6)
INSERT @tableTest (weekDay, roomNum)
SELECT DATEADD(day,num-1,@begindate) as thedate, 100
FROM nums
WHERE num <= DATEDIFF(day,@begindate,@enddate) + 1

;with weekNumber as (
SELECT weekDay, colorName, roomNum, (DATEPART(ww, weekDay) / 2) % 2  as schedule FROM @tableTest
)
UPDATE weekNumber
SET colorName = CASE WHEN weekNumber.schedule = 0  THEN 'Red' ELSE 'Blue' END

SELECT * FROM @tableTest

你在做除法和模运算,如果这个术语对你有意义的话,这会使模的宽度增加一倍

换句话说,不是对1,2,3,4等做模运算

你在对1,1.5,2,2.5,3等进行模运算,明白吗

无论如何,解决方案是将最终更新更改为:

;with weekNumber as (
SELECT weekDay, colorName, roomNum, (DATEPART(ww, weekDay)) % 2  as schedule FROM @tableTest
)
UPDATE weekNumber
SET colorName = CASE WHEN weekNumber.schedule = 0  THEN 'Red' ELSE 'Blue' END

你在做除法和模运算,如果这个术语对你有意义的话,这会使模的宽度增加一倍

换句话说,不是对1,2,3,4等做模运算

你在对1,1.5,2,2.5,3等进行模运算,明白吗

无论如何,解决方案是将最终更新更改为:

;with weekNumber as (
SELECT weekDay, colorName, roomNum, (DATEPART(ww, weekDay)) % 2  as schedule FROM @tableTest
)
UPDATE weekNumber
SET colorName = CASE WHEN weekNumber.schedule = 0  THEN 'Red' ELSE 'Blue' END