我正在使用 MYSQL 数据库,其中开发人员将日期存储为时间戳,而不是可以查询的“日期时间”字段。
以下查询创建了一个“AS”字段 date_formatted 并且输出是正确的。
但是该字段不能在 WHERE 语句中使用以按日期对其进行限制
按日期范围限制时间戳的正确语法是什么?
SELECT *,DATE_FORMAT(FROM_UNIXTIME(`timestamp`), '%Y-%m-%d %H:%i:%s') AS 'date_formatted'
FROM `table`
where 'date_formatted' >= '20210801'
where 语句返回今年的所有结果,换句话说,格式化的日期不会被视为日期时间字段,而是在 where 语句中使用时被视为字符串。
谢谢!
答案 0 :(得分:1)
一种方法是使用having
:
SELECT t.*,
DATE_FORMAT(FROM_UNIXTIME(`timestamp`), '%Y-%m-%d %H:%i:%s') AS date_formatted
FROM `table` t
HAVING date_formatted >= '20210801' ;
但是,最好将其表述为:
SELECT t.*,
DATE_FORMAT(FROM_UNIXTIME(`timestamp`), '%Y-%m-%d %H:%i:%s') AS date_formatted
FROM `table` t
WHERE timestamp >= UNIX_TIMESTAMP('2021-08-01');
此优化器利用 timestamp
列上的索引和统计信息。
答案 1 :(得分:0)
该字段不能在 where 子句中使用,因为您作为输出获取的列不是表的一部分。因此,在表中添加一个新列作为 date_formatted。
ALTER TABLE table
ADD date_formatted date;
UPDATE table
SET date_formatted = DATE_FORMAT(FROM_UNIXTIME(`timestamp`), '%Y-%m-%d %H:%i:%s')
现在在下一步中,您可以在 WHERE 子句中使用 date_formatted。