不同数据库系统中获取当前日期前一天的SQL实现方法

0 次阅读

不同数据库系统中获取当前日期前一天的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-26

CURDATE()用于获取当前日期,INTERVAL 1 DAY表示减去一天。

如果需要获取包含时间的完整日期时间,可以使用:

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

其中:

  • CURDATE()返回日期格式,例如2026-08-27

  • NOW()返回日期和时间,例如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:00

SQLite常用于移动端、本地应用以及轻量级项目,日期计算通常依赖字符串格式处理。


不同数据库获取昨日日期SQL对比

数据库获取前一天日期SQL
MySQLDATE_SUB(CURDATE(), INTERVAL 1 DAY)
OracleSYSDATE - 1
SQL ServerDATEADD(DAY,-1,GETDATE())
PostgreSQLCURRENT_DATE - 1
SQLitedate('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