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

时间:2021-08-02 00:37:01

标签: mysql sql timestamp date-format

我正在使用 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 语句中使用时被视为字符串。

谢谢!

见[Convert Timstamp to MYSQL Date]1

2 个答案:

答案 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。