SQL中DATEADD和DATEDIFF的用法示例介绍

说白了,DATEADD和DATEDIFF就是SQL中日期计算的瑞士军刀。
如果使用得当,它们可以解决 9 0% 的日期相关问题。
比如要查找本月第一天,就用DATEADD(mm,DATEDIFF(mm,0,getdate()),0即可——这个公式在我们去年跑的一个电商推广项目中被大量使用,大约3 000万个订单的日期组就依赖于它。
还有一点需要注意的是,基准日期是1 9 00-01 -01 ,很多人不注意这一点,如果使用不当,会导致年或世纪的计算还有一个重要的细节,比如如果你想精确到月底,可以使用DATEADD(ms,-3 ,DATEDIFF(mm,0,getdate()),1 ))。
去年,在计算报告截止日期时几乎出现了一个错误,因为毫秒没有向下舍入。
也可以用作计算器。
例如,我依靠它与 DATEADD(wk) 结合来计算本周的星期一。
等等,如果您在 MySQL 中使用它,则基准日期是 1 9 7 0-01 -01 说实话,这很困难,但是一旦掌握了它,我认为值得尝试一下。
如闰年的 2 月 2 9 日或月底为星期日时计算。

SQL 日期函数如何判断日期是否在区间内?

说白了,在SQL中判断一个日期是否在某个范围内主要有两个步骤。
集成数据类型并了解时间准确性。
本案细节复杂,例如将行转换为日期、跨越月份界限等,很容易陷入麻烦。

首先使用比较运算符是最直观的。
去年我们做电商项目的时候;我们直接使用 order_date >= '2 02 4 -01 -01 ' AND order_date <= '2 02 4 -06 -3 0' 来检查过去六个月内的订单。
它跑得很快。
另一件事是 BETWEEN 更准确;但关键细节是存在边界值;因此,我们检查“2 02 4 -01 -01 ”和“2 02 4 -1 2 -3 1 ”之间全年的数据。
许多人没有注意到这个事实。

还有另一个关键细节。
例如,处理时间戳字段时;当月的记录无法写入,因为它是在“2 02 4 -06 -01 ”和“2 02 4 -07 -01 ”之间创建的。
将于 6 月 3 0 日 2 3 :5 9 :5 9 错过。
使用 DATE(created_at) 简单提取“2 02 4 -06 -01 ”和“2 02 4 -06 -3 0”之间的日期范围。
起初我认为直接比较时间戳就足够了,但后来我开始使用日期,尤其是天数。
当谈到月亮时,我意识到我错了。

比较之前将日期类型转换为日期类型建议更改。
例如,MySQL 使用 STR_TO_DATE(),SQL Server 使用 CONVERT(DATE)。
说实话,这很令人沮丧。
去年我们因为这个项目停业了两天。

等一下,还有一个。
不同数据库功能之间的差异不容忽视。
Oracle使用TO_DATE(),PostgreSQL直接使用event_date::DATE;但逻辑是一样的。
我认为值得尝试使用像 CURDATE() 或 DATE_SUB() 这样的动态函数,它们非常灵活,可以检查最近 7 天的 log_date 记录。