在 SQL 中写“动态时间”通常是指根据当前时间动态计算日期范围,而不是写死固定日期。以下是几种常见写法(以 SQL Server / MySQL / PostgreSQL 为例):
1. 获取当前时间
-- SQL Server
SELECT GETDATE() AS now-- MySQL
SELECT NOW() AS now-- PostgreSQL
SELECT NOW() AS now
2. 动态时间范围:过去7天
-- SQL Server
WHERE dTestTime >= DATEADD(DAY, -7, GETDATE())-- MySQL
WHERE dTestTime >= DATE_SUB(NOW(), INTERVAL 7 DAY)-- PostgreSQL
WHERE dTestTime >= NOW() - INTERVAL '7 days'
3. 动态时间范围:当天8:00到当前时间
-- SQL Server
WHERE dTestTime >= CAST(GETDATE() AS DATE) + '08:00:00'AND dTestTime <= GETDATE()-- MySQL
WHERE dTestTime >= CONCAT(CURDATE(), ' 08:00:00')AND dTestTime <= NOW()-- PostgreSQL
WHERE dTestTime >= DATE_TRUNC('day', NOW()) + INTERVAL '8 hours'AND dTestTime <= NOW()
4. 动态时间范围:本周一到当前时间
-- SQL Server(周一为一周第一天)
WHERE dTestTime >= DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) + '08:00:00'AND dTestTime <= GETDATE()-- MySQL(周一为一周第一天,取决于@@session_variables)
WHERE dTestTime >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) + INTERVAL 8 HOURAND dTestTime <= NOW()-- PostgreSQL
WHERE dTestTime >= DATE_TRUNC('week', NOW()) + INTERVAL '1 day' + INTERVAL '8 hours' -- 周一AND dTestTime <= NOW()
5. 动态时间范围:本月1号8:00到当前时间
-- SQL Server
WHERE dTestTime >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) + '08:00:00'AND dTestTime <= GETDATE()-- MySQL
WHERE dTestTime >= DATE_FORMAT(CURDATE(), '%Y-%m-01 08:00:00')AND dTestTime <= NOW()-- PostgreSQL
WHERE dTestTime >= DATE_TRUNC('month', NOW()) + INTERVAL '8 hours'AND dTestTime <= NOW()
6. 动态时间范围:前一周(上周一到上周日)
-- SQL Server
WHERE dTestTime >= DATEADD(DAY, -6 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) + '08:00:00'AND dTestTime < DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) + '08:00:00'-- MySQL
WHERE dTestTime >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 7) DAY) + INTERVAL 8 HOURAND dTestTime < DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) + INTERVAL 8 HOUR-- PostgreSQL
WHERE dTestTime >= DATE_TRUNC('week', NOW()) - INTERVAL '6 days' + INTERVAL '8 hours'AND dTestTime < DATE_TRUNC('week', NOW()) + INTERVAL '8 hours'
7. 动态时间范围:过去N小时(如过去12小时)
-- SQL Server
WHERE dTestTime >= DATEADD(HOUR, -12, GETDATE())-- MySQL
WHERE dTestTime >= DATE_SUB(NOW(), INTERVAL 12 HOUR)-- PostgreSQL
WHERE dTestTime >= NOW() - INTERVAL '12 hours'