MySQL datetime、date、time、str之间的转化与比较

本文详细介绍了MySQL中处理日期和时间的各种函数,包括获取当前时间、日期转换、日期加减运算及日期差值计算等实用技巧,是数据库操作中不可或缺的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SELECT NOW(),CURDATE(),CURTIME(),
  -- datetime 转 date time
  NOW(), DATE(NOW()), TIME (NOW()), CONCAT(DATE(NOW()), ' ', TIME (NOW())),
  -- str 转 datetime date time
  str_to_date('2019-04-25 08:50:00', '%Y-%m-%d %H:%i:%s'),DATE('2019-04-25 08:50:00'),TIME ('2019-04-25 08:50:00'),
  str_to_date('2019-04-25 08:50:00', '%Y-%m-%d %T'),
  -- 比较
  NOW() = CONCAT(DATE(NOW()), ' ', TIME (NOW())),
  DATE(NOW()) = '2019-04-25',
  NOW() = DATE(NOW()),
  NOW() = TIME (NOW());
 
-- 获取当前时间的函数
select CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME;	-- 当前时间
select CURRENT_TIMESTAMP(), CURRENT_DATE(), CURRENT_TIME(), CURDATE(), CURTIME();	-- 当前时间
select now(), sysdate(), SLEEP(3), now(), sysdate();	-- 当前时间
select UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME();	-- UTC时间
select UNIX_TIMESTAMP(), UNIX_TIMESTAMP(now());-- 函数返回连接当前时区内的值(时间戳)
select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d %H:%i:%s'); -- 时间戳格式化
select DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s'); -- 时间格式化

-- ----------------- 补充日期操作
/* 对日期进行 加减(两个函数记一个即可)
DATE_ADD(date,INTERVAL expr type);
DATE_SUB(date,INTERVAL expr type);
type取值:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、YEAR_MONTH、DAY_SECOND 等等
*/
-- 加1天
select DATE_ADD(now(),INTERVAL 1 DAY), DATE_SUB(now(),INTERVAL -1 DAY);
-- 复合型:加1年1月
select DATE_ADD(now(),INTERVAL '1 1' YEAR_MONTH), DATE_SUB(now(),INTERVAL '-1 -1' YEAR_MONTH);
-- 加1天2时3分4秒
select DATE_ADD('2020-12-23 00:00:00',INTERVAL '1 2:3:4' DAY_SECOND),DATE_SUB('2020-12-23 00:00:00',INTERVAL '-1 -2:-3:-4' DAY_SECOND);

/* 获取两个日期之间的差值(datetime_expr2-datetime_expr1的值)
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
unit:差值的单位,取值:FRAC_SECOND(低版本不支持)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER或YEAR
*/
-- 查询两个日期间的差值(单位秒)
select TIMESTAMPDIFF(SECOND,'2020-12-01 00:00:00','2020-12-01 01:01:01');

mysql 更多日期和时间相关函数请参考:https://www.mysqlzh.com/doc/118.html

### 在 MySQL 中正确比较 `DATETIME` 类型的数据 为了确保在 MySQL 数据库中能够准确无误地对比两个 `DATETIME` 字段或常量之间的关系,可以遵循如下方法: 当执行涉及 `DATETIME` 的比较操作时,应当注意数据类型的兼容性和精确度。对于直接的等于、大于、小于等基本运算符可以直接应用于 `DATETIME` 列之间或是字符串形式的时间表达式的对照[^2]。 #### 使用标准 SQL 比较运算符 最简单的方式是利用 SQL 提供的标准比较运算符 (`=`, `<`, `>`, `<=`, `>=`) 来处理 `DATETIME` 类型的数据。例如要找出所有创建日期早于特定时刻记录可这样写: ```sql SELECT * FROM table_name WHERE created_at < '2023-01'; ``` #### 处理不同格式输入 有时可能需要将其他格式的时间串转换成 `DATETIME` 格式再做比较。这时可以用到函数如 STR_TO_DATE() 将自定义格式化后的字符串转为合法的 `DATETIME` 对象以便参后续逻辑判断。 ```sql SELECT * FROM events WHERE event_date >= STR_TO_DATE('Oct 1, 2023','%b %d,%Y'); ``` #### 跨时区一致性考虑 考虑到跨多个时区的应用场景下可能出现的问题,推荐尽可能统一采用 UTC 时间作为存储基准,并通过应用层来完成展示层面所需调整的工作。这有助于减少因本地时间和服务器配置差异带来的潜在错误[^3]。 #### 避免隐式类型转换引发问题 值得注意的是,在某些情况下 MySQL 可能会对不同类型间自动尝试进行隐式转换,但这往往不是最佳实践因为它可能导致意外的结果。因此最好显式指定目标类型以确保预期行为的一致性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值