尝试使用单个查询按日期过滤mysql表

时间:2009-12-11 15:18:03

标签: php mysql database

我正在尝试使用单个查询请求今天或之后出现的表中的任何记录。
每条记录的所有日期都存储在单独的列中,例如.. - 一个用于month,一个用于year,一个用于day

显然,我已经获得了今年之后发生的所有记录

$sql = "SELECT * FROM table WHERE year>=".$year_today." 
       ORDER BY year, month, day";

然后我一直试图通过使用:

过滤掉一点
$sql = "SELECT * FROM table 
        WHERE year>=".$year_today." && month>=".$month_today." 
              && day>=".$day_today." 
        ORDER BY year, month, day";

为了测试它,我使用昨天日期在数据库中创建了一条记录,但此记录仍然出现在返回记录列表中。我究竟做错了什么? :(

4 个答案:

答案 0 :(得分:5)

这可以通过很好的方式使用时间函数来实现,而使用DATE列时则更好。

SELECT * FROM TABLE WHERE TIMESTAMP(CONCAT(year,"-",month,"-",day)) >= CURDATE()
好吧,这是邪恶的,因为它没有使用索引...正确的事情将是一个DATE列,但手工完成这一切是令人讨厌的,因为你还必须考虑年份较大但月份较小的情况东西......

答案 1 :(得分:1)

我不知道你是否可以使用“&&”而不是在您的上下文中“AND” - 也许尝试更改您的SQL使用

" AND month>=".$month_today." AND day>=".$day_today."

编辑:

作为Nick答案的扩展,为了使sql行为正确,你可以编码:

$sql = "SELECT * FROM table WHERE (  
(year>".$year_today.")
OR (year=".$year_today." && month>".$month_today." )
OR (year=".$year_today." && month=".$month_today."&& day>=".$day_today.")
)
 ORDER BY year, month, day";

...但是这比转换到日期和使用日期比较更加麻烦

EDIT2:

但是再次,如果这些列被索引,则可以使用索引。如果使用转换为日期的性能完全可以接受,那么以这种方式编写SQL仍然需要付出更多努力。

答案 2 :(得分:1)

将日期与日期进行比较:

SELECT * FROM table WHERE 
  STR_TO_DATE(
    CONCAT(year
    , '-'
    , right(concat('00', month), 2)
    , '-'
    , right(concat('00', day), 2))
  , '%Y-%m-%d')

>= STR_TO_DATE('2009-12-11', '%Y-%m-%d')

答案 3 :(得分:1)

检查日期是否在此查询失败的另一个日期之后:

$sql = "SELECT * FROM table WHERE year>=".$year_today." && month>=".$month_today." && day>=".$day_today." ORDER BY year, month, day";

februari的12月12日比februari的第15天小,但仍然在它之后,因为它在不同的月份....