当前位置: 首页 > news >正文

MySQL 时间函数全解析:从 NOW() 到 UTC_TIMESTAMP() 的深度实践与选择策略

‍在 MySQL 中如何获取当前日期和时间?主要用于数据记录、时间计算和过滤等场景。MySQL 提供了一系列函数来满足不同的精度和格式需求。

以下是几种最核心和常用的方法。

一、 核心函数概述

MySQL 提供了多个函数来获取当前时间,区别在于返回值的格式和精度:

| 函数 | 返回格式 | 描述 | 示例输出 |

| : | : | : | : |

| `NOW()` | `YYYY-MM-DD HH:MM:SS` | 返回当前的日期和时间(会话时区)。 | `2023-10-27 14:32:05` |

| `CURRENT_TIMESTAMP()` | `YYYY-MM-DD HH:MM:SS` | `NOW()` 的同义词,功能完全相同。 | `2023-10-27 14:32:05` |

| `CURDATE()` | `YYYY-MM-DD` | 返回当前的日期。 | `2023-10-27` |

| `CURRENT_DATE()` | `YYYY-MM-DD` | `CURDATE()` 的同义词。 | `2023-10-27` |

| `CURTIME()` | `HH:MM:SS` | 返回当前的时间。 | `14:32:05` |

| `CURRENT_TIME()` | `HH:MM:SS` | `CURTIME()` 的同义词。 | `14:32:05` |

| `SYSDATE()` | `YYYY-MM-DD HH:MM:SS` | 返回函数执行时的日期时间。 | `2023-10-27 14:32:05` |

| `UTC_DATE()` | `YYYY-MM-DD` | 返回当前的 UTC 日期。 | `2023-10-27` |

| `UTC_TIME()` | `HH:MM:SS` | 返回当前的 UTC 时间。 | `06:32:05` |

| `UTC_TIMESTAMP()` | `YYYY-MM-DD HH:MM:SS` | 返回当前的 UTC 日期和时间。 | `2023-10-27 06:32:05` |

二、 详细说明与示例

1. 获取完整的日期和时间 (`NOW()` vs `SYSDATE()`)

`NOW()` 返回语句开始执行时的时间。在一个 SQL 语句中,无论 `NOW()` 被调用多少次,它返回的值都是相同的。

`SYSDATE()` 返回该函数被执行时的精确时间。这意味着在一个语句中多次调用 `SYSDATE()` 会得到不同的值。

示例:

```sql

SELECT NOW(), SLEEP(2), NOW();

-- 结果:两个 NOW() 返回的时间完全相同,即使查询中间睡眠了2秒。

-- | NOW()               | SLEEP(2) | NOW()               |

-- ||-||

-- | 2023-10-27 14:35:01 |        0 | 2023-10-27 14:35:01 |

SELECT SYSDATE(), SLEEP(2), SYSDATE();

-- 结果:两个 SYSDATE() 返回的时间相差2秒。

-- | SYSDATE()           | SLEEP(2) | SYSDATE()           |

-- ||-||

-- | 2023-10-27 14:35:03 |        0 | 2023-10-27 14:35:05 |

```

注意: 由于 `SYSDATE()` 的行为可能对复制(Replication)和确定性查询造成意想不到的影响,通常建议优先使用 `NOW()`。

2. 获取日期或时间的部分

如果你只需要当前日期或当前时间,可以使用相应的函数。

示例:

```sql

-- 插入一条记录,自动记录创建日期和时间

INSERT INTO orders (product_id, quantity, created_at)

VALUES (101, 2, NOW());

-- 查询今天的所有订单

SELECT FROM orders WHERE DATE(created_at) = CURDATE();

-- 查询所有在下午2点之后创建的订单

SELECT FROM orders WHERE TIME(created_at) > '14:00:00';

```

3. 获取 UNIX 时间戳

`UNIX_TIMESTAMP()` 函数通常用于获取一个 UNIX 时间戳(自 '1970-01-01 00:00:00' UTC 以来的秒数)。

  如果不带参数调用,它返回当前的 UNIX 时间戳。

  如果带一个日期时间参数,它返回该日期时间对应的 UNIX 时间戳。

示例:

```sql

SELECT UNIX_TIMESTAMP(); -- 输出类似:1698411725

SELECT UNIX_TIMESTAMP('2023-10-27 14:32:05'); -- 将指定时间转换为时间戳

```

三、 高级用法:时区的影响

时间函数返回的值取决于 MySQL 的时区设置。

  `NOW()`, `CURDATE()` 等函数返回的是当前会话时区的时间。

  `UTC_DATE()`, `UTC_TIMESTAMP()` 等函数返回的是 UTC 时间。

你可以查看和设置会话时区:

```sql

-- 查看当前时区设置

SELECT @@system_time_zone, @@session.time_zone;

-- 设置当前会话的时区(例如,设置为东八区 - 北京时间)

SET SESSION time_zone = '+08:00';

```

示例:

假设 MySQL 服务器位于伦敦(UTC时区),而你的会话时区设置为北京时间(UTC+8)。

```sql

SET SESSION time_zone = '+08:00';

SELECT NOW(), UTC_TIMESTAMP(), UNIX_TIMESTAMP();

```

输出可能会是:

```

++++

| NOW()               | UTC_TIMESTAMP()     | UNIX_TIMESTAMP()    |

++++

| 2023-10-27 22:00:00 | 2023-10-27 14:00:00 |         1698415200  |

++++

```

`UNIX_TIMESTAMP()` 不受时区设置影响,它总是基于 UTC。

总结与最佳实践

1.  常用选择:

      记录数据创建/更新时间:在表结构设计中,通常使用 `TIMESTAMP` 或 `DATETIME` 类型的字段,并将其默认值设置为 `CURRENT_TIMESTAMP`(等同于 `NOW()`)。

      获取当前时间:优先使用 `NOW()`,而不是 `SYSDATE()`,除非你有特殊需求。

      只需要日期或时间部分:使用 `CURDATE()` 或 `CURTIME()`。

2.  时区意识:

      如果你的应用是国际化的,务必注意时区问题。在存储时间时,可以考虑使用 UTC 时间(`UTC_TIMESTAMP()`)并在应用层根据用户所在地进行转换,或者确保会话时区设置正确。

3.  表结构设计例子:

    ```sql

    CREATE TABLE logs (

        id INT AUTO_INCREMENT PRIMARY KEY,

        message TEXT,

        -- 设置默认值,在插入时自动写入当前时间

        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

        -- 使用 DATETIME 类型也可以,但语法略有不同

        updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP

    );

    ```

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。


文章转载自:

http://wBwsSchM.jgmLb.cn
http://dnP98Sps.jgmLb.cn
http://qIy72c3N.jgmLb.cn
http://dEGpbGse.jgmLb.cn
http://hCxClWTB.jgmLb.cn
http://TYXJlm1k.jgmLb.cn
http://pToNmplG.jgmLb.cn
http://lj8dTzp5.jgmLb.cn
http://qOoZzOun.jgmLb.cn
http://itM6o1N0.jgmLb.cn
http://jysGuWDX.jgmLb.cn
http://7ksASicz.jgmLb.cn
http://4I62tJRM.jgmLb.cn
http://eUaclV7B.jgmLb.cn
http://tNISMV9y.jgmLb.cn
http://ZPlz4I1i.jgmLb.cn
http://mpk6CGSJ.jgmLb.cn
http://OPgWVWik.jgmLb.cn
http://5k0virxS.jgmLb.cn
http://UTlyzOXP.jgmLb.cn
http://1LJbnzog.jgmLb.cn
http://Ca7fi6Hr.jgmLb.cn
http://IRaymFCe.jgmLb.cn
http://YAaiCyn5.jgmLb.cn
http://4dvkyw76.jgmLb.cn
http://OxJG4u3T.jgmLb.cn
http://oPrVsvCm.jgmLb.cn
http://ihyX6TMJ.jgmLb.cn
http://JR0Uyh9c.jgmLb.cn
http://KNmSL6lV.jgmLb.cn
http://www.dtcms.com/a/366476.html

相关文章:

  • vscode launch.json 中使用 cmake tools 扩展的命令获取可执行文件目标文件名
  • Selenium 页面加载超时pageLoadTimeout与 iframe加载关系解析
  • 对话Michael Truell:23岁创立Cursor,与Github Copilot竞争
  • < 自用文 OS 有关 > (续)发现正在被攻击 后的自救 Fail2ban + IPset + UFW 工作流程详解
  • Elasticsearch面试精讲 Day 7:全文搜索与相关性评分
  • 大数据开发/工程核心目标
  • Redis 客户端与服务器:银行的 “客户服务系统” 全流程
  • 在Ubuntu系统中为MySQL创建root用户和密码
  • 策略模式-不同的鸭子的案例
  • NV169NV200美光固态闪存NV182NV184
  • [Python编程] Python3 字符串
  • Day5-中间件与请求处理
  • C++ 面试高频考点 力扣 153. 寻找旋转排序数组中的最小值 二分查找 题解 每日一题
  • C++ opencv+gstreamer编译,C++ opencv4.5.5+gstreamer1.0 -1.24.12 编译 ,cmake 4.0.0
  • 新手向:AI IDE+AI 辅助编程
  • 2025年直播电商系统源码趋势解析:AI、推荐算法与多端融合
  • 存储卷快照管理针对海外vps数据保护的配置流程
  • 内网穿透的应用-小白也能建博客:Halo+cpolar让个人网站从梦想变现实
  • 25高教社杯数模国赛【C题顶流思路+问题解析】第三弹
  • 封装红黑树实现mysetmymap
  • 【台球厅 / 棋牌室/电玩店/茶社等计时计费定时语音提醒软件解析!】佳易王 计时计费高级版V18.3 实测:双时间显示 + 语音提醒 + 智能记事全解析
  • 【C++】16. set和map
  • mysql安装(压缩包方式8.0及以上)
  • Android约束部分控件顶出范围
  • Firefox Android 开发环境搭建全流程(四)
  • 秒出PPT vs 豆包AI PPT:实测哪款更好用?
  • Gamma AI:AI演示文稿制作工具,高效解决PPT框架搭建难与排版耗时问题
  • bash自带的切片操作
  • java对接物联网设备(一)——使用okhttp网络工具框架对接标准API接口
  • 一文吃透 C#中异步编程Task