将月日转换为每周工作日 SQL

Convert Month Days Into Weekdays Per Week In SQL

我有一个日历 table,我想在网格中显示每个月,当我从 table 开始 select 一个月时,我有一些行与月日和工作日列,但我必须每周将其转换为多行以在网格中显示月份。 我的 select 获取月份信息的命令是这样的

SELECT Monthday, Weekday FROM Calendar Where Month = 5

结果为:

Monthday | Weekday
--------- --------
   1          4
   2          5
   3          6
   4          7
   5          1
   6          2
   7          3
   8          4
   .          .
   .          .
   .          .

我想把它转换成这样的东西

1 | 2 | 3 | 4 | 5 | 6 | 7 
-- --- --- --- --- --- --
            1   2   3   4
5   6   7   8   .   .   .

就像一个日历网格。
我认为答案是通过 Pivot,但我不知道如何,你知道如何转换我的 select 命令的解决方案吗?

假设您有一个日历 table,其结构如下所述,其中填充了如下查询:

CREATE TABLE Calendar (
    TheDate DATE PRIMARY KEY,
    YearNumber SMALLINT,
    MonthNumber SMALLINT,
    DayNumber SMALLINT,
    WeekdayNumber SMALLINT
)

INSERT INTO dbo.Calendar (TheDate, YearNumber, MonthNumber, DayNumber, WeekdayNumber)
SELECT x.TheDate, 
    YEAR(x.TheDate) AS YearNumber, MONTH(x.TheDate) AS MonthNumber, DAY(x.TheDate) AS DayNumber, 
    (DATEPART(WEEKDAY,x.TheDate)+@@DATEFIRST-2)%7+1 AS WeekdayNumber
FROM (
    SELECT TOP 365 DATEADD(DAY,N-1,'20210101') AS TheDate
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY low) AS N FROM master..spt_values) t 
    ORDER BY N
) x

WeekdayNumber 的公式以这种方式编写,以忽略 SET DATEFIRST 设置并始终将星期一视为一周的第一天。如果您希望另一天成为一周中的第一天,请将 -2 调整为另一个值。

要显示特定月份的日历之类的内容,您可以使用如下查询:

SELECT * FROM (
    SELECT DayNumber, WeekdayNumber, 
        DENSE_RANK() OVER (ORDER BY DayNumber-WeekdayNumber) AS WeekNumber
    FROM dbo.Calendar WHERE YearNumber=2021 AND MonthNumber=5
) t
PIVOT (MAX(DayNumber) FOR WeekdayNumber IN ([1],[2],[3],[4],[5],[6],[7])) p

这会产生以下结果:

WeekNumber           1      2      3      4      5      6      7
-------------------- ------ ------ ------ ------ ------ ------ ------
1                    NULL   NULL   NULL   NULL   NULL   1      2
2                    3      4      5      6      7      8      9
3                    10     11     12     13     14     15     16
4                    17     18     19     20     21     22     23
5                    24     25     26     27     28     29     30
6                    31     NULL   NULL   NULL   NULL   NULL   NULL

我仅使用 DayNumberWeekdayNumber 列来计算周数,然后我使用 PIVOT 以所需格式排列 DayNumber 的值。