【问题标题】:Getting consecutive dates in SQL Server 2012 with CTE使用 CTE 在 SQL Server 2012 中获取连续日期
【发布时间】:2016-06-17 07:46:18
【问题描述】:

我必须在 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 天,而不是从每周一到周日开始的 7 天间隔。我究竟做错了什么?谢谢!

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

【问题讨论】:

    标签: sql-server weekday


    【解决方案1】:

    如果该术语对您有意义,那么您正在执行除法 AND 模数运算,这会导致您将模数的“宽度”加倍。 :)

    换句话说,不是对 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
    

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多