在SQL中进行日期比较查询时,时间戳通常以整数或 datetime 类型存储,而日期字符串是文本格式。如果直接把时间戳和日期字符串用等于或大于号比较,数据库可能做隐式转换,导致结果错误或无法使用索引。明确两者差异并统一类型,是写出正确查询的关键。

时间戳与日期字符串的区别
时间戳一般指从1970-01-01开始的秒或毫秒数,也可能是数据库里的 datetime 字段。日期字符串如 '2023-08-01' 是可读文本。它们在底层存储上不同,比较前最好转成同一种类型。
常见错误写法
下面这种写法在部分数据库中会逐行转换,性能差且容易出错:
-- 假设 create_time 是时间戳整数,错误地将它与字符串比较 SELECT * FROM orders WHERE create_time > '2023-08-01';
使用类型转换函数统一比较
应当把日期字符串转成时间戳,或把时间戳格式化成日期后再比。不同数据库函数不同。
MySQL示例
用 UNIX_TIMESTAMP 把字符串转时间戳:
-- 将日期字符串转为时间戳再比较
SELECT * FROM orders
WHERE create_time > UNIX_TIMESTAMP('2023-08-01');
PostgreSQL示例
用 TO_TIMESTAMP 或日期强制转换:
-- 把字符串转成 timestamp 类型 SELECT * FROM orders WHERE to_timestamp(create_time) > '2023-08-01'::date;
SQL Server示例
-- 用 CONVERT 将字符串转为 datetime SELECT * FROM orders WHERE DATEADD(second, create_time, '1970-01-01') > CONVERT(datetime, '2023-08-01');
注意事项
- 避免在时间戳字段上套函数,否则索引可能失效,应转换对比的常量。
- 注意时区,时间戳通常是UTC,字符串可能含时区语义。
- 用
EXPLAIN检查执行计划,确认比较走了索引。
统一类型再做比较,既准确又高效,是SQL日期查询的基本功。