使用sqlserver的getdate函数来写一段sql,只有日期一个字段,从当日一直往前推3年,展示每一日的日期出来并且排除所有星期天和法定节假日
时间: 2024-02-27 19:57:02 浏览: 203
可以使用 SQL Server 的日期函数和条件语句来实现该需求,具体的 SQL 语句如下所示:
```
WITH cte AS (
SELECT DATEADD(YEAR, -3, GETDATE()) AS dt
UNION ALL
SELECT DATEADD(DAY, -1, dt)
FROM cte
WHERE dt > DATEADD(YEAR, -3, GETDATE()) - 1095 -- 相当于推3年前的今天往前推1095天(即3年)
)
SELECT dt
FROM cte
WHERE
DATEPART(weekday, dt) NOT IN (1, 7) -- 排除星期天和星期六
AND NOT EXISTS ( -- 排除法定节假日
SELECT 1
FROM holidays
WHERE holiday_date = dt
)
OPTION (MAXRECURSION 0); -- 必须指定递归次数,0 表示无限递归
```
上述 SQL 语句中,使用了公用表表达式(CTE)来生成日期序列,然后使用条件语句来排除星期天和法定节假日。其中,`DATEADD` 函数用于日期加减,`DATEPART` 函数可以返回日期的星期几,`NOT EXISTS` 子查询可以检查日期是否为法定节假日。由于日期序列的长度可能比较长,需要使用 `OPTION (MAXRECURSION 0)` 指定递归次数为无限递归。
阅读全文