将月日转换为每周工作日 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
我仅使用 DayNumber
和 WeekdayNumber
列来计算周数,然后我使用 PIVOT
以所需格式排列 DayNumber 的值。
我有一个日历 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
我仅使用 DayNumber
和 WeekdayNumber
列来计算周数,然后我使用 PIVOT
以所需格式排列 DayNumber 的值。