SQL Server中查询时间段的语句写法

本文介绍了在SQL Server中如何使用WHERE子句和比较运算符查询特定日期、时间及日期时间范围内的数据,提供了相应的查询语句模板,并强调了日期时间值应符合SQL Server的格式要求。

在SQL Server中,要查询一个特定的时间段,可以使用WHERE子句和比较运算符来指定日期或时间范围。下面是一些常见的查询时间段的语句写法:

  1. 查询特定日期范围的数据:
SELECT *
FROM 表名
WHERE date_column >= '开始日期' AND date_column <= '结束日期';

在上面的代码中,将表名替换为要查询的表名,date_column替换为包含日期的列名,'开始日期’和’结束日期’替换为具体的日期值。这将返回指定日期范围内的所有数据。

  1. 查询特定时间范围的数据:
1.--查询当天: select * from [TABLE] where DateDiff(dd,[dateadd],getdate())=0 2.--查询24小时内的: select * from [TABLE] where DateDiff(hh,[dateadd],getDate())<=24 3.--本月记录 SELECT * FROM [TABLE] WHERE datediff(month,[dateadd],getdate())=0 4.--本周记录 SELECT * FROM [TABLE] WHERE datediff(week,[dateadd],getdate())=0 5.--当前系统日期、时间 select getdate() 6.--在向指定日期加上一段时间的基础上,返回新的 datetime 值(例如:向日期加上2天 ) select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000 7.--返回跨两个指定日期的日期和时间边界数。 select datediff(day,'2004-09-01','2004-09-18') --返回:17 8.--返回代表指定日期的指定日期部分的整数。 SELECT DATEPART(month, '2004-10-15') --返回 10 9.--返回代表指定日期的指定日期部分的字符串 SELECT datename(weekday, '2004-10-15') --返回:星期五 10.--day(), month(),year() --可以与datepart对照一下 select 当前日期=convert(varchar(10),getdate(),120),当前时间=convert(varchar(8),getdate(),114) 11.--返回星期几 select datename(dw,'2004-10-15') 12.--返回周和星期 select 本年第多少周=datename(week,'2004-10-15'),今天是周几=datename(weekday,'2004-10-15') 13.--计算到2个时间之间间隔的工作日和工作小时 CREATE FUNCTION dbo.WORKDAYDIFF(@fromDate datetime, @thruDate datetime) RETURNS int AS BEGIN declare @result int set @fromDate = dateadd(day, case when datepart(weekday, @fromDate); % 7 <= 1 then 2 - datepart(weekday, @fromDate); % 7 else 0 end, @fromDate); set @thruDate = dateadd(day, case when datepart(weekday, @thruDate); % 7 <= 1 then -1 - datepart(weekday, @thruDate); % 7 else 0 end, @thruDate); set @result = datediff(hour,@fromDate,@thruDate); / 24 - datediff(week,@fromDate,@thruDate); * 2 if(@result < 0); set @result = 0 return @result END 14.计算哪一天是本周的星期一 SELECT DATEADD(week, DATEDIFF(week,'1900-01-01',getdate()), '1900-01-01') -- 返回2006-11-06 00:00:00.000 或 SELECT DATEADD(week, DATEDIFF(week,0,getdate()),0) 15.当前季度的第一天 SELECT DATEADD(quarter, DATEDIFF(quarter,0,getdate()), 0) —返回2006-10-01 00:00:00.000 16.如何取得某个月的天数 SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1,0))) —返回28
SQL 查询中,**查询某个时间段内的数据**是常见的需求,比如查询某个日期范围、时间范围内的记录。 下面以几种常见数据库(MySQL、PostgreSQLSQL Server、Oracle)为例,说明如何编写 **时间段查询语句**,并提供示例代码。 --- ## ✅ 1. 查询某个日期/时间范围内的数据(基本语法) ### 示例:查询 2024-01-01 到 2024-12-31 之间的订单 ```sql SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'; ``` > ⚠️ 注意: > - `BETWEEN` 是 **闭区间**,即包括开始和结束时间。 > - 如果字段是 `DATETIME` 或 `TIMESTAMP` 类型,**结束时间建议使用 `'2024-12-31 23:59:59'`** 来避免遗漏当天的数据。 --- ## ✅ 2. 查询某一天的数据(精确到日期) ### 示例:查询 2024-06-15 的所有记录 ```sql SELECT * FROM logs WHERE log_time >= '2024-06-15' AND log_time < '2024-06-16'; ``` > ✅ 推荐使用这种方式而不是 `DATE(log_time) = '2024-06-15'`,因为这样可以使用索引。 --- ## ✅ 3. 查询最近 N 天的数据(动态时间) ### 示例:查询最近 7 天的记录(MySQL) ```sql SELECT * FROM users WHERE create_time >= NOW() - INTERVAL 7 DAY; ``` ### PostgreSQL: ```sql SELECT * FROM users WHERE create_time >= NOW() - INTERVAL '7 days'; ``` ### SQL Server: ```sql SELECT * FROM users WHERE create_time >= GETDATE() - 7; ``` ### Oracle: ```sql SELECT * FROM users WHERE create_time >= SYSDATE - 7; ``` --- ## ✅ 4. 查询某个小时段内的数据 ### 示例:查询今天 9:00 到 18:00 之间的访问记录 ```sql SELECT * FROM visits WHERE visit_time BETWEEN '2025-04-05 09:00:00' AND '2025-04-05 18:00:00'; ``` 或者使用函数(MySQL): ```sql SELECT * FROM visits WHERE DATE(visit_time) = '2025-04-05' AND HOUR(visit_time) BETWEEN 9 AND 17; ``` --- ## ✅ 5. 查询某个时间段内的数据(带时区处理) 如果你的字段是 `TIMESTAMP WITH TIME ZONE` 类型,可以使用时区转换。 ### PostgreSQL 示例: ```sql SELECT * FROM events WHERE event_time AT TIME ZONE 'Asia/Shanghai' BETWEEN '2025-01-01 00:00:00' AND '2025-12-31 23:59:59'; ``` --- ## ✅ 6. 查询当前月份的数据 ### MySQL 示例: ```sql SELECT * FROM sales WHERE YEAR(sale_date) = YEAR(CURDATE()) AND MONTH(sale_date) = MONTH(CURDATE()); ``` ### PostgreSQL 示例: ```sql SELECT * FROM sales WHERE sale_date >= DATE_TRUNC('month', CURRENT_DATE) AND sale_date < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month'; ``` --- ## ✅ 7. 查询某个时间字段在两个时间点之间的记录(更通用写法) ```sql SELECT * FROM appointments WHERE start_time >= '2025-04-01 08:00:00' AND end_time <= '2025-04-30 18:00:00'; ``` --- ## ✅ 8. 查询时间重叠的记录(如预约冲突) 比如你有一个预约表,想查出和某个时间段冲突的预约: ```sql SELECT * FROM appointments WHERE NOT (end_time <= '2025-04-05 10:00:00' OR start_time >= '2025-04-05 12:00:00'); ``` 这个查询会找出与 `10:00 - 12:00` 时间段有重叠的所有预约。 --- ## ✅ 9. 使用参数化查询(适用于程序中使用) ### Java + JDBC 示例: ```java String sql = "SELECT * FROM orders WHERE order_date BETWEEN ? AND ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, "2024-01-01"); stmt.setString(2, "2024-12-31 23:59:59"); ResultSet rs = stmt.executeQuery(); ``` --- ## ✅ 总结对比表 | 场景 | SQL 示例 | 推荐方式 | |------|----------|----------| | 查询某日期范围 | `BETWEEN '2024-01-01' AND '2024-12-31'` | ✅ 推荐 | | 查询某一天 | `>= '2024-06-15' AND < '2024-06-16'` | ✅ 推荐 | | 查询最近 N 天 | `NOW() - INTERVAL N DAY` | ✅ 推荐 | | 查询当前月 | `YEAR() = YEAR(CURDATE()) AND MONTH() = MONTH(CURDATE())` | ✅ 推荐 | | 查询时间重叠 | `NOT (end <= new_start OR start >= new_end)` | ✅ 推荐 | --- ##
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值