使用sqlserver的getdate函数来写一段sql,只有日期一个字段,从当日一直往前推3年,展示每一日的日期出来并且排除所有星期天和法定节假日
时间: 2024-02-27 13:57:02 浏览: 233
可以使用 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)` 指定递归次数为无限递归。
相关问题
sqlserver 日期区间
### SQL Server 日期区间查询
在 SQL Server 中,可以通过 `WHERE` 子句配合比较运算符来限定日期范围。对于特定日期区间的查询,基本语法如下:
```sql
SELECT *
FROM 表名
WHERE date_column >= '开始日期'
AND date_column <= '结束日期';
```
此方法适用于简单的起始和终止日期之间的数据检索[^1]。
为了提高精确度并适应不同的业务需求,还可以利用内置的日期函数进一步细化查询条件。例如计算两个具体时刻之间相隔的日数:
```sql
SELECT DATEDIFF(DAY, GETDATE(), '2025-01-01');
```
上述命令会返回当前时间到未来某个固定日期(这里指明的是2025年的第一天)相差的具体天数[^2]。
另外一种常见操作是对给定的时间戳加上一定数量的时间单位,从而推导出新的时间节点;这通常用于模拟周期性的事件发生规律或是调整记录的有效期限等场景:
```sql
SELECT CAST(DATEADD(DAY, 1, StartTime) AS DATETIME)
FROM TABLE;
```
这段代码展示了如何基于现有字段 `StartTime` 向其增加一天后的结果作为新值输出。
最后值得注意的一点是在构建涉及多个复杂逻辑分支的情况下,可以借助于 CASE WHEN THEN 结构来进行更加灵活多变的选择控制,确保最终得到的结果集满足预期的要求[^3]。
sql Server 日期模糊查询
SQL Server 中的日期模糊查询通常用于搜索包含特定日期范围的数据。当需要查找接近、等于或者在某个时间点附近的记录时,可以使用一些特定的操作符和函数。以下是几个常见的模糊查询示例:
1. 使用 `BETWEEN` 关键字:如果你想查询某个字段值是否在两个确切日期之间,如查询2022年1月1日至1月31日之间的所有记录,可以用以下语句:
```sql
SELECT * FROM table_name WHERE date_field BETWEEN '2022-01-01' AND '2022-01-31';
```
2. 使用 `>=` 和 `<=`:如果你想要查询包含某个起始和结束日期的所有日期,例如“从2022年1月1日开始到2022年的最后一天”,可以这样写:
```sql
SELECT * FROM table_name WHERE date_field >= '2022-01-01' AND date_field <= DATEADD(day, -1, GETDATE());
```
3. `LIKE` 操作符:虽然 `LIKE` 主要是用于字符串匹配,但在 SQL Server 中,也可以结合转换函数 `CONVERT(date, column)` 来对日期进行模糊匹配,比如查询近一周的数据:
```sql
SELECT * FROM table_name WHERE date_field LIKE CONVERT(varchar(10), DATEADD(day, -7, GETDATE()), 112) + '%';
```
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)