DATE()函数用于提取日期时间值的日期部分,返回'YYYY-MM-DD'格式;仅接受DATETIME/TIMESTAMP类型,字符串需先用STR_TO_DATE()转换;在WHERE中使用会导致索引失效,应改用范围查询。

DATE() 函数在 MySQL 中怎么用
MySQL 的 DATE() 函数只接受一个参数,且必须是日期时间类型(如 DATETIME、TIMESTAMP),它会直接剥离时间部分,返回纯日期值(格式为 'YYYY-MM-DD')。
常见错误是传入字符串但没被 MySQL 自动识别为合法日期——比如 DATE('2024-10-05 14:30:00') 能正常工作,但 DATE('05/10/2024') 会返回 NULL,因为格式不被默认解析。
- 推荐先用
STR_TO_DATE()显式转换再套DATE(),例如:DATE(STR_TO_DATE('05/10/2024', '%d/%m/%Y')) - 对已知是
DATETIME字段,直接写DATE(created_at)最安全 - 注意:如果字段本身是
DATE类型,DATE()不报错但毫无必要,纯属冗余
PostgreSQL 没有 DATE() 函数,该用什么
PostgreSQL 不提供 DATE() 这个函数名,而是用类型强制转换或 DATE_PART() 等替代方案。最常用、语义最接近的是 ::DATE 类型转换操作符。
例如:SELECT created_at::DATE FROM orders; 效果等同于 MySQL 的 DATE(created_at)。
- 不能写
DATE(created_at),否则报错:function date(timestamp without time zone) does not exist - 如果只需要年份,用
EXTRACT(YEAR FROM created_at)更精准,避免转成字符串再切分 -
created_at::DATE在索引友好性上和原生DATE列一致,不影响查询计划
SQL Server 的 CONVERT 和 CAST 怎么选
SQL Server 没有 DATE() 函数(直到 2008 才引入 DATE 数据类型,但无同名函数),提取日期要用 CONVERT() 或 CAST() 转成 DATE 类型。
两者都能用,但行为略有差异:
-
CAST(created_at AS DATE)更简洁,SQL 标准兼容性好,推荐新项目优先用 -
CONVERT(DATE, created_at)功能相同,但多出样式参数(对DATE类型无效,仅对CHAR类型有意义) - 如果源字段是
datetime(旧版),转DATE后精度丢失不可逆,但不会报错 - 避免用
CONVERT(VARCHAR, created_at, 10)截字符串——看似取了日期,实则返回字符串,无法参与日期运算或索引查找
WHERE 条件里用 DATE() 容易导致索引失效
在 WHERE 子句中对字段套 DATE(created_at)(MySQL)或 created_at::DATE(PostgreSQL),会让数据库无法使用 created_at 上的索引,尤其在大表中性能骤降。
正确做法是改写条件,让字段“裸奔”参与比较:
- 错:
WHERE DATE(created_at) = '2024-10-05' - 对:
WHERE created_at >= '2024-10-05' AND created_at - 对(MySQL 8.0+):用生成列 + 索引,例如建一个
created_date DATE AS (DATE(created_at))并对其加索引
这个坑不看执行计划很难发现,等数据量上来才暴露慢查。

















