不同数据库系统中获取当前日期前一天的SQL实现方法
在数据库开发和数据分析场景中,经常需要根据当前日期获取前一天的数据,例如统计昨日订单、生成日报表、处理定时任务数据等。由于不同数据库系统提供的日期函数存在差异,获取当前日期前一天的SQL写法也有所不同。
掌握主流数据库中的日期计算方式,可以提高SQL编写效率,避免因数据库类型不同导致语句无法执行的问题。本文将详细介绍MySQL、Oracle、SQL Server、PostgreSQL、SQLite等常见数据库获取当前日期前一天的方法,并分析各自的使用场景。
MySQL获取当前日期前一天的方法
MySQL提供了丰富的日期处理函数,其中最常用的是DATE_SUB()函数,可以直接对日期进行减法操作。
使用DATE_SUB函数
SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY);执行结果会返回当前日期的前一天,例如当前日期为:
2026-08-27返回结果:
2026-08-26CURDATE()用于获取当前日期,INTERVAL 1 DAY表示减去一天。
如果需要获取包含时间的完整日期时间,可以使用:
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);其中:
CURDATE()返回日期格式,例如2026-08-27NOW()返回日期和时间,例如2026-08-27 10:30:00
使用DATE_ADD函数
日期减少也可以通过增加负数实现:
SELECT DATE_ADD(CURDATE(), INTERVAL -1 DAY);这种写法效果与DATE_SUB()一致。
查询昨日数据示例
例如查询订单表中昨天创建的数据:
SELECT *
FROM orders
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
AND create_time < CURDATE();这种方式可以避免时间精度问题,更适合实际业务查询。
Oracle获取当前日期前一天的方法
Oracle数据库主要使用SYSDATE和日期运算完成日期计算。
使用SYSDATE减一天
Oracle中日期类型支持直接进行加减:
SELECT SYSDATE - 1 FROM dual;结果就是当前时间的一天前。
例如:
2026-08-27 15:20:00返回:
2026-08-26 15:20:00如果只需要日期,不需要时间:
SELECT TRUNC(SYSDATE) - 1 FROM dual;TRUNC()可以清除时间部分。
使用CURRENT_DATE函数
Oracle也支持:
SELECT CURRENT_DATE - 1 FROM dual;CURRENT_DATE返回当前会话时区的日期时间。
查询昨天数据示例
SELECT *
FROM orders
WHERE create_time >= TRUNC(SYSDATE) - 1
AND create_time < TRUNC(SYSDATE);这是Oracle中查询昨日数据较常见的写法。
SQL Server获取当前日期前一天的方法
SQL Server主要通过GETDATE()和日期函数DATEADD()实现日期计算。
使用DATEADD函数
SELECT DATEADD(DAY, -1, GETDATE());参数说明:
第一个参数
DAY表示计算单位第二个参数
-1表示减少一天第三个参数表示基准日期
返回结果:
2026-08-26 10:30:00获取纯日期格式
SQL Server 2008及以上版本支持:
SELECT CAST(DATEADD(DAY, -1, GETDATE()) AS DATE);返回:
2026-08-26使用CURRENT_TIMESTAMP
SQL标准中定义了CURRENT_TIMESTAMP:
SELECT DATEADD(DAY, -1, CURRENT_TIMESTAMP);与GETDATE()效果类似。
PostgreSQL获取当前日期前一天的方法
PostgreSQL日期处理功能非常强大,可以直接使用时间间隔计算。
使用CURRENT_DATE减去INTERVAL
SELECT CURRENT_DATE - INTERVAL '1 day';返回:
2026-08-26 00:00:00如果只需要日期:
SELECT CURRENT_DATE - 1;PostgreSQL支持日期类型直接进行整数运算:
SELECT CURRENT_DATE - 1;结果:
2026-08-26查询昨日数据
SELECT *
FROM orders
WHERE create_time >= CURRENT_DATE - INTERVAL '1 day'
AND create_time < CURRENT_DATE;这种写法能够利用索引,提高查询效率。
SQLite获取当前日期前一天的方法
SQLite没有传统数据库中的日期类型,通常通过内置日期函数处理时间。
使用date函数
SELECT date('now', '-1 day');返回:
2026-08-26其中:
now表示当前时间-1 day表示向前推一天
获取完整时间
SELECT datetime('now', '-1 day');返回:
2026-08-26 10:30:00SQLite常用于移动端、本地应用以及轻量级项目,日期计算通常依赖字符串格式处理。
不同数据库获取昨日日期SQL对比
| 数据库 | 获取前一天日期SQL |
|---|---|
| MySQL | DATE_SUB(CURDATE(), INTERVAL 1 DAY) |
| Oracle | SYSDATE - 1 |
| SQL Server | DATEADD(DAY,-1,GETDATE()) |
| PostgreSQL | CURRENT_DATE - 1 |
| SQLite | date('now','-1 day') |
虽然实现方式不同,但核心逻辑都是基于当前日期减去一天。
日期计算中的常见注意事项
1. 注意日期和时间类型区别
很多业务场景中,数据库字段可能是:
DATE类型
DATETIME类型
TIMESTAMP类型
如果直接比较日期和时间,可能出现数据遗漏。
例如:
WHERE create_time = '2026-08-26'对于包含时间的数据:
2026-08-26 14:30:00可能无法匹配。
更推荐使用范围查询:
WHERE create_time >= '2026-08-26 00:00:00'
AND create_time < '2026-08-27 00:00:00'2. 注意时区问题
分布式系统中,服务器时间、数据库时间、应用时间可能存在差异。
例如:
应用服务器使用UTC时间
数据库使用本地时间
用户位于其他时区
此时直接使用数据库当前时间可能导致日期偏移。
生产环境中应统一时间标准,例如统一使用UTC存储,再根据业务时区转换。
3. 避免对字段使用日期函数影响索引
下面这种写法可能导致索引失效:
WHERE DATE(create_time) = CURRENT_DATE - 1因为数据库需要对每一行执行函数计算。
更优化的方式:
WHERE create_time >= CURRENT_DATE - 1