如何将SQL查询中in_date的结束日期默认设为上周最后一日?
如何配置SQL查询使in_date的结束日期以上一周最后一天为基准
根据需求,需要动态将查询的结束日期设为上一周(周一至周日)的最后一天的23:59:59,起始日期固定为'2020-01-01 00:00:00'。以下是主流数据库的实现方案:
MySQL 实现
通过DATE_SUB和DAYOFWEEK函数计算上上周日(即目标结束日期):
SELECT ga.in_date FROM in_txn ga LEFT JOIN cntr_mst cm ON cm.cntr_num = ga.cntr_num WHERE status_active = 'A' AND in_date BETWEEN '2020-01-01 00:00:00' AND CONCAT( DATE_SUB(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY), ' 23:59:59' )
逻辑说明:
DAYOFWEEK(CURDATE())-1计算当前日期到上一个周日的天数,减去后得到上一个周日- 再减7天,得到上一周的周日(即用户示例中2023-04-16)
- 拼接
23:59:59得到完整的结束时间点
SQL Server 实现
使用DATEADD和DATEPART函数计算目标日期:
SELECT ga.in_date FROM in_txn ga LEFT JOIN cntr_mst cm ON cm.cntr_num = ga.cntr_num WHERE status_active = 'A' AND in_date BETWEEN '2020-01-01 00:00:00' AND CONVERT(VARCHAR(19), DATEADD(day, -7, DATEADD(day, -(DATEPART(weekday, GETDATE())-1), GETDATE())), 120 )
逻辑说明:
DATEADD(day, -(DATEPART(weekday, GETDATE())-1), GETDATE())得到上一个周日- 减7天得到上一周的周日
CONVERT函数将日期格式化为YYYY-MM-DD HH:MI:SS格式
PostgreSQL 实现
借助date_trunc函数定位周起始,再计算目标日期:
SELECT ga.in_date FROM in_txn ga LEFT JOIN cntr_mst cm ON cm.cntr_num = ga.cntr_num WHERE status_active = 'A' AND in_date BETWEEN '2020-01-01 00:00:00' AND (date_trunc('week', current_date) - interval '8 days') + interval '23 hours 59 minutes 59 seconds'
逻辑说明:
date_trunc('week', current_date)得到当前周的周一(PostgreSQL默认周起始为周一)- 减8天得到上一周的周日
- 加上
23:59:59的时间偏移,得到完整结束时间
内容的提问来源于stack exchange,提问作者leong
相关产品推荐
相关产品推荐

