在mysql数据库的实际使用中,timestamp类型存储的是包含年月日时分秒的时间戳,而date类型仅存储年月日信息,很多时候我们需要把timestamp转换为date来满足业务需求,比如按天分组统计订单数量、查询某一天的所有操作记录等。

使用DATE函数直接转换
mysql内置的DATE()函数是最直接的转换方式,它可以接收一个timestamp类型的参数,返回对应的date类型结果。该函数会直接截取timestamp中的年月日部分,自动忽略时分秒信息。
示例表结构如下,其中create_time字段为timestamp类型:
-- 创建测试表
CREATE TABLE test_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入测试数据
INSERT INTO test_order (order_no) VALUES ('ORD001'), ('ORD002'), ('ORD003');
查询时将create_time转换为date类型的语句如下:
-- 转换单个字段 SELECT id, order_no, DATE(create_time) AS order_date FROM test_order;
执行上述语句后,order_date列就会返回仅包含年月日的date类型数据。
使用CAST函数进行类型转换
除了DATE()函数,还可以使用CAST()函数实现类型转换,该函数是mysql中通用的类型转换函数,支持多种数据类型之间的转换。
转换语法为CAST(字段名 AS DATE),示例如下:
-- 使用CAST转换timestamp为date SELECT id, order_no, CAST(create_time AS DATE) AS order_date FROM test_order;
这种方式的转换结果和DATE()函数完全一致,开发者可以根据编码习惯选择使用。
转换时的注意事项
时区影响
timestamp类型在mysql中会受时区设置影响,当数据库时区发生变化时,同一timestamp值转换得到的date结果可能不同。如果业务需要固定时区的转换结果,建议先通过CONVERT_TZ()函数统一时区后再进行转换。
-- 先转换时区再转为date,假设原时区为UTC,需要转为东八区 SELECT DATE(CONVERT_TZ(create_time, '+00:00', '+08:00')) AS order_date FROM test_order;
NULL值处理
如果timestamp字段的值为NULL,那么转换后的结果也会是NULL,在编写查询语句时如果需要处理空值,可以配合IFNULL()或者COALESCE()函数使用。
-- 处理NULL值,为空时返回默认日期 SELECT IFNULL(DATE(create_time), '2000-01-01') AS order_date FROM test_order;
实际业务场景示例
假设我们需要统计每天的订单数量,就可以先转换create_time为date,再按转换后的日期分组统计:
-- 按天统计订单数量 SELECT DATE(create_time) AS order_date, COUNT(*) AS order_count FROM test_order GROUP BY order_date ORDER BY order_date DESC;
上述语句会返回每一天的订单总数,并且按照日期从新到旧排序,满足日常统计需求。