DATEPART仅在SQL Server及Azure SQL中支持,用于提取年份(YEAR)或月份(MONTH)等日期部分,返回整数;MySQL用YEAR()/MONTH(),PostgreSQL用EXTRACT(YEAR FROM date),SQLite用strftime('%Y', date)。
DATEPART 只在 SQL Server(及 Azure SQL)中原生支持,MySQL、PostgreSQL 或 SQLite 都没有这个函数。如果你在其他数据库里看到 DATEPART 报错,不是写法问题,而是根本不存在。
它用法简单但参数顺序固定:DATEPART(datepart, date),第一个参数是你要取的单位(如 year、month),第二个是日期表达式。
DATEPART(year, '2023-04-15') → 返回 2023
DATEPART(month, '2023-04-15') → 返回 4(不是 04,不补零)datepart 值包括:year、quarter、month、day、week、weekday、hour 等weekday 默认以周日为第一天(值为 1),可通过 SET DATEFIRST 调整别硬套 DATEPART,各数据库有对应函数,强行改名只会报错。
YEAR() 和 MONTH() 函数,例如 YEAR('2023-04-15') → 2023;MONTH('2023-04-15') → 4
EXTRACT(),语法是 EXTRACT(YEAR FROM '2023-04-15'::date),注意要显式转类型,否则可能因字段类型推导失败strftime(),例如 strftime('%Y', '2023-04-15') 返回字符串 '2023',strftime('%m', '2023-04-15') 返回 '04'(带前导零)这是跨数据库迁移时最常踩的坑——开发在 SQL Server 上写了 DATEPART(year, order_date),上线到 MySQL 就直接报错 FUNCTION DATEPART does not exist。
DATEPART 本身不慢,但容易触发索引失效——尤其当它套在列上时,比如 WHERE DATEPART(year, created_at) = 2023。
created_at 列上的索引,全表扫描风险高WHERE created_at >= '2023-01-01' AND created_at
NULL,DATEPART 返回 NULL,不是 0 或空字符串,做分组或过滤时得提前处理