sql中没有内置datediffNOW函数,需用各数据库的标准函数组合实现:SQL Server用DATEDIFF+GETDATE,mysql用TIMESTAMPDIFF+NOW,postgresql用CURRENT_DATE减法或AGE,oracle用SYSDATE减法。

SQL 中没有内置的 DATEDIFFNOW 函数 —— 这是一个常见误解。标准 SQL(如 PostgreSQL、MySQL、SQL Server、Oracle)均不提供名为 DATEDIFFNOW 的函数。实际使用中,用户常是想“计算某日期字段与当前时间的差值”,这需组合标准日期函数实现。
常用替代方案:用 DATEDIFF + GETDATE/NOW/CURRENT_TIMESTAMP
不同数据库用不同函数获取当前时间,再配合 DATEDIFF(SQL Server)或等效函数(如 TIMESTAMPDIFF、AGE、减法运算)完成计算:
- SQL Server:
select DATEDIFF(day, OrderDate, GETDATE()) AS DaysSince FROM Orders;支持单位:year、month、day、hour、minute、second 等 - MySQL:
SELECT TIMESTAMPDIFF(DAY, OrderDate, NOW()) AS DaysSince FROM Orders;注意:参数顺序为TIMESTAMPDIFF(unit, start, end),即“end − start” - PostgreSQL:
SELECT CURRENT_DATE - OrderDate AS DaysSince FROM Orders;(日期相减得整数天) 或更精确:SELECT EXTRACT(DAY FROM AGE(NOW(), OrderDate))::int FROM Orders; - Oracle:
SELECT TRUNC(SYSDATE) - TRUNC(OrderDate) AS DaysSince FROM Orders;直接用日期相减即得天数(结果为 number)
为什么不能直接写 DATEDIFFNOW?
SQL 标准未定义该函数,各厂商也未采纳为扩展。若在代码或文档中看到 DATEDIFFNOW,通常是以下情况之一:
- 自定义函数(如用户在 SQL Server 中 CREATE function DATEDIFFNOW(…))
- ORM 框架或 BI 工具封装的伪函数(例如某些低代码平台的表达式语法)
- 误记或混淆了 excel 中的
DATEDIF(NOW(),...)写法
实用建议:跨数据库写法尽量保持可移植性
若需兼容多种数据库,推荐用通用逻辑替代“假想的 DATEDIFFNOW”:
- 只比天数?优先用
current_date - date_column(PostgreSQL/Oracle/Standard SQL) - 需精确到秒?用
EXTRACT(EPOCH FROM (NOW() - date_col))(PostgreSQL)或NOW() - date_col(MySQL,返回时间间隔) - 业务层统一处理:把日期差计算移到应用代码(python/java),SQL 只返回原始时间字段,更清晰可控
基本上就这些。记住核心:没有 DATEDIFFNOW,但有更灵活、更标准的方式达成同样目标。