在 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'