欢迎光临
我们一直在努力

数据库中的日期时间处理

在数据库中,对日期时间的处理需求是比较常见的,不同数据库系统(如 MySQL、PostgreSQL、SQL Server、Oracle 等)对日期函数的支持略有差异。下面以MySQL为例,并简要对比其他主流数据库:

一、常用日期时间函数(以MySQl为例)

1. CURDATE() / CURRENT_DATE() / DATE(NOW())

  • 功能:返回当前日期

SELECT CURDATE(); — 2026-01-29
SELECT CURRENT_DATE(); — 同上
SELECT DATE(NOW()); — 同上

        注意NOW() 返回完整时间戳(含时分秒),DATE() 提取其中的日期部分,也可以是其他日期时间参数。

2. DATE_FORMAT(date, format)

  • 功能:将日期按照指定格式输出为字符串;
  • 常用格式符:
  • %Y:4位年份(如 2026)
  • %y:2位年份(如 26)
  • %m:月份(01–12)
  • %c:月份(1–12,无前导零)
  • %d:日(01–31)
  • %H:小时(00–23)
  • %i:分钟(00–59)
  • %s 或 %S:秒(00–59)

SELECT DATE_FORMAT('2026-01-29', '%Y年%m月%d日');
— 结果:2026年01月29日

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
— 结果:2026-01-29 14:30:45

        注意:DATE_FORMAT( )  返回的是字符串,不能直接用于日期的比较和计算;

3. DATE_SUB(date, INTERVAL expr unit)

  • 功能:从指定日期减去一个时间间隔
  • 常用单位:
  • DAY, WEEK, MONTH, YEAR
  • HOUR, MINUTE, SECOND
  • QUARTER, MICROSECOND 等

SELECT DATE_SUB('2026-01-29', INTERVAL 7 DAY);
— 2026-01-22

SELECT DATE_SUB('2026-01-22', INTERVAL -7 DAY);
— 2026-01-29

SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
— 当前时间减一个月

二、其他重要日期函数(MySQL)

4. NOW() vs SYSDATE()

  • NOW():返回语句开始执行时的时间(固定值,即使函数内多次调用也相同)
  • SYSDATE():返回函数执行时的实时时间(可能变化)

SELECT NOW(), SLEEP(2), NOW(); — 两个 NOW() 相同
SELECT SYSDATE(), SLEEP(2), SYSDATE();– 两个 SYSDATE() 相差约2秒

5. DATEDIFF(date1, date2)

  • 功能:返回两个日期之间的天数差(仅日期部分,忽略时间)

SELECT DATEDIFF('2026-02-01', '2026-01-29'); — 3

6. TIMESTAMPDIFF(unit, start, end)

  • 功能:按指定单位计算两个时间戳的差值(支持年、月、日、小时等)

SELECT TIMESTAMPDIFF(YEAR, '2020-01-01', '2026-01-29'); — 6
SELECT TIMESTAMPDIFF(MONTH, '2025-12-01', '2026-01-29'); — 1

7. STR_TO_DATE(str, format)

  • 功能:将字符串按指定格式解析为日期(与 DATE_FORMAT 互为逆操作),常用于导入非标准格式的日期字符串。

SELECT STR_TO_DATE('29/01/2026', '%d/%m/%Y');
— 2026-01-29

8. EXTRACT(unit FROM date)

  • 功能:从日期中提取特定部分(如年、月、日等)

SELECT EXTRACT(YEAR FROM '2026-01-29'); — 2026
SELECT EXTRACT(MONTH FROM NOW()); — 1

三、跨数据库对比(简要)

功能MySQLPostgreSQLSQL ServerOracle
当前日期 CURDATE() CURRENT_DATE GETDATE() SYSDATE
格式化 DATE_FORMAT() TO_CHAR() FORMAT() (2012+) TO_CHAR()
加减日期 DATE_ADD(), INTERVAL + interval '1 day' DATEADD(day, 1, date) date + 1
字符串转日期 STR_TO_DATE() TO_DATE() CONVERT() / CAST() TO_DATE()

四、使用建议

  • 避免在 WHERE 子句中对字段使用函数(如 WHERE DATE_FORMAT(col, '%Y') = '2026'),会导致索引失效。应改用范围查询:

    WHERE col >= '2026-01-01' AND col < '2027-01-01'

  • 统一存储格式:建议数据库中使用 DATE、DATETIME 或 TIMESTAMP 类型存储,而非字符串。
  • 时区问题:注意 DATETIME(无时区)与 TIMESTAMP(自动转换时区)的区别。
  • !!注意:具体使用场景根据不同的数据库具体分析,本文只以MySQl数据库举例;

    赞(0)
    未经允许不得转载:171主机测评 » 数据库中的日期时间处理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址