4

我总是将我的日期作为 unix 时间戳存储在数据库中。现在我有两个日期:我想在网站上显示的一些图像的开始日期和结束日期。该图像应在“开始日期”上可见,并在达到“结束日期”后消失。

我现在使用这个简单的查询:

SELECT name, image, link
FROM exclusive
WHERE CURDATE( ) >= from_unixtime( start_date, '%d-%m-%Y' )  
AND CURDATE( ) <= from_unixtime( end_date, '%d-%m-%Y' )
AND category = 'movies'
LIMIT 0 , 5

但这每次都返回一个空结果,尽管数据范围内有两个字段。

我在这里做错了什么?

提前致谢。

4

3 回答 3

3

试试这个,它还有一个额外的好处,你实际上可以使用你在开始和结束日期可能拥有的任何索引。

SELECT name, image, link
FROM exclusive
WHERE UNIX_TIMESTAMP() BETWEEN start_date AND end_date
AND category = 'movies'
LIMIT 0 , 5
于 2012-12-19T18:45:04.843 回答
3

问题是您将比较作为字符串类型,而不是时间戳。因此,格式很重要。更改为 yyyy-mm-dd 使其工作(因为最重要的部分,年份,在左边)。

但更好的和可优化的索引是作为时间戳进行比较。

WHERE start_date <= unix_timestamp(curdate())
    AND end_date >= unit_timestamp(curdate())

或者,对于某些 SQL 引擎,使用 BETWEEN 运算符:

WHERE unix_timestamp(curdate()) BETWEEN start_date AND end_date
于 2012-12-19T18:46:04.110 回答
3

而不是格式化,使用该DATE()函数删除时间戳的时间部分:

SELECT name, image, link
FROM exclusive
WHERE 
    CURDATE( ) BETWEEN DATE(from_unixtime( start_date ) )
    AND DATE(from_unixtime( end_date ) )
    AND category = 'movies'
LIMIT 0 , 5
于 2012-12-19T18:48:51.757 回答