MySQL时间函数from_unixtime()date_format()unix_timestamp()now()使用说明

本文介绍了MySQL中常用的时间函数,包括获取当前时间、时间戳转换、日期格式化等操作,并通过实例展示了如何使用这些函数来处理时间和日期数据。

MySQL时间函数from_unixtime()date_format()unix_timestamp()now()使用说明

now() 当前时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-09-10 19:20:19 |
+---------------------+
unix_timestamp() 当前时间戳
mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1536578429 |
+------------------+
unix_timestamp(now()) 当前时间转换成时间戳
mysql> select unix_timestamp(now());
+-----------------------+
| unix_timestamp(now()) |
+-----------------------+
|            1536578445 |
+-----------------------+
unix_timestamp(‘2018-08-08’) 指定时间转换成时间戳
mysql> select unix_timestamp('2018-08-08');
+------------------------------+
| unix_timestamp('2018-08-08') |
+------------------------------+
|                   1533657600 |
+------------------------------+
from_unixtime(1533657600) 将时间戳转换为时间 默认格式 ‘%Y-%m-%d %H:%i:%s’
mysql> select from_unixtime(1533657600);
+---------------------------+
| from_unixtime(1533657600) |
+---------------------------+
| 2018-08-08 00:00:00       |
+---------------------------+
from_unixtime(1533657600, ‘%Y-%m-%d’) 将时间戳转换为时间 并进行格式化
mysql> select from_unixtime(1533657600, '%Y-%m-%d');
+---------------------------------------+
| from_unixtime(1533657600, '%Y-%m-%d') |
+---------------------------------------+
| 2018-08-08                            |
+---------------------------------------+
查询时间戳字段 转换为时间格式显示
mysql> select from_unixtime(ctime, '%Y-%m-%d') from logs limit 1;
+----------------------------------+
| from_unixtime(ctime, '%Y-%m-%d') |
+----------------------------------+
| 2018-09-18                       |
+----------------------------------+
where时间戳字段
mysql> select count(*) from logs where from_unixtime(ctime, '%Y%m%d')=20180808 limit 1;
+----------+
| count(*) |
+----------+
|    12345 |
+----------+
date_format() 将时间进行格式化显示
mysql> select date_format(now(), '%Y/%m/%d');
+--------------------------------+
| date_format(now(), '%Y/%m/%d') |
+--------------------------------+
| 2018/08/08                     |
+--------------------------------+
where时间字段
mysql> select count(*) from logs where date_format(cdate, '%Y%m%d')=20180910 limit 1;
+----------+
| count(*) |
+----------+
|      123 |
+----------+
<think>我们正在讨论如何将日期时间格式化为时间戳,但请注意:时间戳通常指Unix时间戳(从1970-01-01 00:00:00 UTC开始的秒数或毫秒数),而DATE_FORMAT函数是用于将日期格式化为字符串的,它本身不能直接生成时间戳。 不过,我们可以通过其他方式实现: 1. 如果已有日期时间字段,想转为时间戳,可以使用UNIX_TIMESTAMP()函数。 2. 如果要将一个已经格式化的日期字符串再转为时间戳,可以先使用STR_TO_DATE将其转为日期类型,再用UNIX_TIMESTAMP。 但是,用户的问题是如何使用DATE_FORMAT函数将日期时间格式化为时间戳?这实际上是一个误解,因为DATE_FORMAT的输出是字符串,而不是时间戳(数字)。所以我们需要澄清这一点。 根据引用[2]中的例子,他们使用FROM_UNIXTIME时间戳转换为日期字符串,然后用DATE_FORMAT再次格式化。但反过来,如果我们有日期时间字段,要得到时间戳,应该用UNIX_TIMESTAMP。 因此,回答应该包括: 1. 解释DATE_FORMAT的作用(格式化日期为字符串)和UNIX_TIMESTAMP的作用(将日期转为时间戳)。 2. 说明如何用UNIX_TIMESTAMP得到时间戳。 3. 如果用户确实想用DATE_FORMAT来输出一个看起来像时间戳的字符串(比如将日期格式化为“19700101000000”这样的连续数字),那么可以演示,但这并不是标准的时间戳。 步骤: 1. 使用UNIX_TIMESTAMP获取时间戳(整数): SELECT UNIX_TIMESTAMP(your_datetime_column) FROM your_table; 2. 如果非要用DATE_FORMAT来模拟一个类似时间戳的字符串(例如:'20250718085553'),可以这样做: SELECT DATE_FORMAT(your_datetime_column, '%Y%m%d%H%i%s') AS formatted_timestamp FROM your_table; 3. 注意:第二种方法得到的是字符串,不是数字时间戳。 根据引用[3]中提到的IF函数处理NULL值,我们也可以结合使用,避免NULL值出错。 示例: 假设有一个表`events`,有一个`event_time`字段(DATETIME类型),我们想获取时间戳: 方法1(推荐,得到真正的Unix时间戳): SELECT IF(event_time, UNIX_TIMESTAMP(event_time), NULL) AS timestamp FROM events; 方法2(用DATE_FORMAT得到字符串形式的时间戳): SELECT IF(event_time, DATE_FORMAT(event_time, '%Y%m%d%H%i%s'), NULL) AS formatted_timestamp FROM events; 所以,总结:通常我们使用UNIX_TIMESTAMP来获取时间戳,而DATE_FORMAT用于自定义格式的日期字符串。 引用说明: [^2]中展示了如何将时间戳转换为日期字符串并进行格式化,这正好是UNIX_TIMESTAMP的逆过程。 [^3]中展示了如何处理NULL值的情况。 因此,回答如下:</think>### MySQL DATE_FORMAT 函数格式化时间戳详解 需要明确区分两个概念: 1. **时间戳**:Unix 时间戳(如 `1658131200`)表示从 1970-01-01 00:00:00 UTC 开始的秒数 2. **日期格式化**:将日期/时间转换为特定格式的字符串(如 `2022-07-19 00:00:00`) DATE_FORMAT() 函数用于日期格式化(概念2),**不能直接生成时间戳**(概念1)。以下是完整解决方案: --- ### 一、正确获取时间戳的方法 #### 方法1:使用 UNIX_TIMESTAMP() 函数 ```sql -- 获取当前时间戳 SELECT UNIX_TIMESTAMP(); -- 输出: 1721292000 (示例值) -- 转换日期为时间戳 SELECT UNIX_TIMESTAMP('2025-07-18 08:55:53'); -- 输出: 1758092153 ``` #### 方法2:组合 DATE_FORMAT + STR_TO_DATE(复杂场景) ```sql -- 步骤1: 格式化为标准字符串 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_time; -- 步骤2: 转换为时间戳 SELECT UNIX_TIMESTAMP( STR_TO_DATE( DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s' ) ) AS timestamp; ``` --- ### 二、DATE_FORMAT 格式化日期(非时间戳) 当需要将时间戳转换为可读格式时(引用[2]的典型用法): ```sql SELECT DATE_FORMAT( FROM_UNIXTIME(history.clock), -- 时间戳转日期 '%Y-%m-%d %H:00' -- 按小时格式化 ) AS formattime FROM history WHERE history.clock BETWEEN 1586340120 AND 1586944920; ``` **格式化符号说明**: | 符号 | 含义 | 示例 | |------|---------------|------------| | `%Y` | 四位年份 | 2025 | | `%m` | 两位月份 | 07 | | `%d` | 两位日期 | 18 | | `%H` | 24小时制小时 | 08 | | `%i` | 分钟 | 55 | | `%s` | 秒 | 53 | | `%T` | 时间 | 08:55:53 | --- ### 三、处理 NULL 值场景(引用[3]) ```sql SELECT IF(create_time, DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y/%m/%d %H:%i'), NULL ) AS safe_formatted_time FROM orders; ``` --- ### 四、常见错误解决方案 | 问题场景 | 错误示例 | 正确方案 | |---------------------------|-----------------------------------|-----------------------------------| | 直接格式化时间戳 | `DATE_FORMAT(1658131200, ...)` | 先用 `FROM_UNIXTIME()` 转换 | | 忽略时区差异 | 未指定时区 | 使用 `CONVERT_TZ()` 函数转换时区 | | 处理 NULL 导致格式错误 | 未做 NULL 判断 | 使用 `IF()` 或 `COALESCE()` 处理 | > **关键总结**: > 1. 获取时间戳 → 用 `UNIX_TIMESTAMP()`[^2] > 2. 时间戳转日期 → 用 `FROM_UNIXTIME()` + `DATE_FORMAT()`[^2] > 3. 时区转换 → 用 `CONVERT_TZ(date, 'UTC', 'Asia/Shanghai')` > 4. NULL 处理 → 用 `IF(date_col, DATE_FORMAT(...), NULL)`[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值