将时间戳转换为可在 WHERE 中使用的查询中的 MYSQL 日期

Convert Timestamp to MYSQL Date In Query usable in WHERE

我正在使用 MYSQL 数据库,其中开发人员将日期存储为时间戳而不是可以查询的 'datetime' 字段。

下面的查询创建了一个 '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 语句 returns 今年的所有结果,换句话说,格式化日期未被视为日期时间字段,当在 where 语句中使用时,它被视为字符串。

谢谢!

见[Convert Timstamp to MYSQL Date]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 列上的索引和统计信息。

该字段不能在 where 子句中使用,因为您作为输出获得的列不是 table 的一部分。因此,将新列添加到 table 作为 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。