如何通过单条查询(无需存储过程)计算当年首日至今日的天数?
实现当年第一天到今日的天数计算(无需存储过程)
完全可以通过单条查询实现,针对不同主流数据库的写法如下:
MySQL/MariaDB
使用DATEDIFF函数计算日期差,结合DATE_FORMAT生成当年第一天:
SELECT DATEDIFF(CURDATE(), DATE_FORMAT(CURDATE(), '%Y-01-01')) + 1 AS days_from_year_start;
- 说明:
CURDATE()获取当前日期,DATE_FORMAT(CURDATE(), '%Y-01-01')得到当年1月1日,DATEDIFF返回结束日与开始日的天数差,加1是为了包含第一天(比如1月1日当天算1天)。
SQL Server
用DATEFROMPARTS构造当年第一天,配合DATEDIFF计算天数:
SELECT DATEDIFF(DAY, DATEFROMPARTS(YEAR(GETDATE()), 1, 1), GETDATE()) + 1 AS days_from_year_start;
- 说明:
GETDATE()获取当前日期,DATEFROMPARTS(YEAR(GETDATE()),1,1)生成当年1月1日,DATEDIFF(DAY, ...)得到天数差,加1后得到包含首尾的总天数。
Oracle
通过TRUNC函数截断日期到年份起点,直接计算日期差:
SELECT TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YYYY') + 1 AS days_from_year_start FROM DUAL;
- 说明:
TRUNC(SYSDATE, 'YYYY')得到当年1月1日,Oracle中日期直接相减会返回天数差,加1后得到包含当天的总天数。
PostgreSQL
使用DATE_TRUNC获取当年第一天,再与当前日期相减:
SELECT (CURRENT_DATE - DATE_TRUNC('year', CURRENT_DATE)::DATE) + 1 AS days_from_year_start;
- 说明:
DATE_TRUNC('year', CURRENT_DATE)生成当年1月1日的时间戳,转成日期后和CURRENT_DATE相减得到天数差,加1后得到总天数。
示例验证
以2023年7月24日为例,执行上述任意查询都会返回204,与你给出的结果一致。
内容的提问来源于stack exchange,提问作者Henry Olive
相关产品推荐
相关产品推荐

