如何生成从 sql 中的特定星期一到当前日期的 table 星期一日期
how to generate a table of Monday dates that from a specific Monday to current date in sql
在 SQL 服务器中,我需要生成截至当前日期的 table 个星期一。
开始日期始终是 2020-04-27
,即星期一。
例如,如果今天是 2020-05-25
,我需要一个 table,如下所示:
date
0 2020-04-27
1 2020-05-04
2 2020-05-11
3 2019-05-18
4 2019-05-25
如果今天的日期是 2020-05-23
,那么它是:
date
0 2020-04-27
1 2020-05-04
2 2020-05-11
3 2019-05-18
我怎样才能产生那样的 table?
您可以使用递归 CTE 生成日期列表:
WITH mondays AS (
SELECT CAST('2020-04-27' AS date) AS monday
UNION ALL
SELECT DATEADD(WEEK, 1, monday)
FROM mondays
WHERE DATEADD(WEEK, 1, monday) <= GETDATE()
)
SELECT *
FROM mondays
输出:
monday
2020-04-27
2020-05-04
2020-05-11
2020-05-18
请注意,如果要生成超过 100 个日期的列表,则需要增加最大递归级别(默认为 100)。这可以通过在查询末尾添加 OPTION (MAXRECURSION 0)
来完成,即
SELECT *
FROM mondays
OPTION (MAXRECURSION 0)
使用master..spt_values
这个默认table达到这个
DECLARE @DATEFROM DATE ='2020-04-27',
@DATETO DATE= '2020-05-25'
SELECT ALLDATES AS MONDATES FROM
(SELECT DATEADD(D, NUMBER, @DATEFROM) AS ALLDATES FROM MASTER..SPT_VALUES
WHERE TYPE = 'P' AND NUMBER BETWEEN 0 AND DATEDIFF(DD, @DATEFROM, @DATETO)) AS D1
WHERE DATENAME(DW, D1.ALLDATES)IN('MONDAY')
在 SQL 服务器中,我需要生成截至当前日期的 table 个星期一。
开始日期始终是 2020-04-27
,即星期一。
例如,如果今天是 2020-05-25
,我需要一个 table,如下所示:
date
0 2020-04-27
1 2020-05-04
2 2020-05-11
3 2019-05-18
4 2019-05-25
如果今天的日期是 2020-05-23
,那么它是:
date
0 2020-04-27
1 2020-05-04
2 2020-05-11
3 2019-05-18
我怎样才能产生那样的 table?
您可以使用递归 CTE 生成日期列表:
WITH mondays AS (
SELECT CAST('2020-04-27' AS date) AS monday
UNION ALL
SELECT DATEADD(WEEK, 1, monday)
FROM mondays
WHERE DATEADD(WEEK, 1, monday) <= GETDATE()
)
SELECT *
FROM mondays
输出:
monday
2020-04-27
2020-05-04
2020-05-11
2020-05-18
请注意,如果要生成超过 100 个日期的列表,则需要增加最大递归级别(默认为 100)。这可以通过在查询末尾添加 OPTION (MAXRECURSION 0)
来完成,即
SELECT *
FROM mondays
OPTION (MAXRECURSION 0)
使用master..spt_values
这个默认table达到这个
DECLARE @DATEFROM DATE ='2020-04-27',
@DATETO DATE= '2020-05-25'
SELECT ALLDATES AS MONDATES FROM
(SELECT DATEADD(D, NUMBER, @DATEFROM) AS ALLDATES FROM MASTER..SPT_VALUES
WHERE TYPE = 'P' AND NUMBER BETWEEN 0 AND DATEDIFF(DD, @DATEFROM, @DATETO)) AS D1
WHERE DATENAME(DW, D1.ALLDATES)IN('MONDAY')