我正在尝试使用单个查询请求今天或之后出现的表中的任何记录。
每条记录的所有日期都存储在单独的列中,例如.. - 一个用于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";
为了测试它,我使用昨天日期在数据库中创建了一条记录,但此记录仍然出现在返回记录列表中。我究竟做错了什么? :(
答案 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";
...但是这比转换到日期和使用日期比较更加麻烦
但是再次,如果这些列被索引,则可以使用索引。如果使用转换为日期的性能完全可以接受,那么以这种方式编写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天小,但仍然在它之后,因为它在不同的月份....