关于A_received_date字段去时间处理及WHERE子句编写的咨询
问题解答
1. DATEADD计算结果仅展示日期的实现方案
根据你使用的数据库类型,选择对应语法即可:
- SQL Server(2008及以上版本):将计算结果强转为DATE类型
CAST(DATEADD(DD,90,cd.A_RECEIVED_DATE) AS DATE) -- 或者使用CONVERT语法 CONVERT(DATE, DATEADD(DD,90,cd.A_RECEIVED_DATE)) - MySQL:使用DATE()函数截断时间部分
DATE(DATE_ADD(cd.A_RECEIVED_DATE, INTERVAL 90 DAY)) - PostgreSQL/Oracle:使用DATE强转或TRUNC函数
-- PostgreSQL写法 DATE(DATEADD(DAY,90,cd.A_RECEIVED_DATE)) -- Oracle写法 TRUNC(cd.A_RECEIVED_DATE + 90)
2. 筛选接收日起5天后到期账户的WHERE条件
以下两种写法可按需选择:
简化写法(无需考虑索引性能时使用)
核心是计算两个日期的天数差等于5:
- SQL Server:
WHERE DATEDIFF(DD, cd.A_RECEIVED_DATE, GETDATE()) = 5 - MySQL:
WHERE DATEDIFF(CURDATE(), cd.A_RECEIVED_DATE) = 5
高性能写法(可命中A_RECEIVED_DATE字段索引)
通过区间匹配避免在字段上使用函数,大表查询时性能优势明显:
- SQL Server:
WHERE cd.A_RECEIVED_DATE >= DATEADD(DD, DATEDIFF(DD, 0, GETDATE()) -5, 0) AND cd.A_RECEIVED_DATE < DATEADD(DD, DATEDIFF(DD, 0, GETDATE()) -4, 0) - MySQL:
WHERE cd.A_RECEIVED_DATE >= DATE_SUB(CURDATE(), INTERVAL 5 DAY) AND cd.A_RECEIVED_DATE < DATE_SUB(CURDATE(), INTERVAL 4 DAY)
注:如果你有单独存储的到期日字段
DUE_DATE,只需将条件调整为DATEDIFF(DUE_DATE, cd.A_RECEIVED_DATE) =5即可。
内容的提问来源于stack exchange,提问作者Srajan
相关产品推荐
相关产品推荐

