2016-06-28 95 views
0

我有两个字段,“cont_time_published”和“cont_date_published”,我想用它来过滤记录列表中的结果。日期和时间MySQL语句

select * 
from news 
WHERE cont_date_published < CURDATE() AND cont_time_published < CURTIME() 

我想实现只显示发布时间和发布日期过去的记录的列表。因此,它会过滤一个有今天的日期,但时间仍然是未来的记录。

当日期是今天和时间是未来时,结果是错误的。

cont_date_published是“仅DATE”字段,而cont_time_published是“TIME”字段。

+0

如果不是太晚了,刚将两列合并到DATETIME类型之一中,并节省您所有的麻烦。 –

+0

ÁlvaroGonzález由于日期和时间选择器的原因,我的框架不允许时间和日期成为一个字段。 – Cavemanharris

回答

0
select * from news WHERE cont_date_published < CURDATE() 

这将足以获得过去发布的记录。

1

试试这个

SELECT * 
FROM news 
WHERE (cont_date_published < CURDATE()) AND (cont_time_published < CURTIME()) 
ORDER BY id DESC; 
2

如果你需要得到公布,在过去(今在过去数小时或之前)记录尝试:

SELECT * 
FROM news 
    WHERE cont_date_published < CURDATE() 
    OR (cont_date_published = CURDATE() AND cont_time_published < CURTIME()); 

对不起我的错误,忘记了OR

+0

谢谢你完全按照我想要的方式工作。 – Cavemanharris

+0

@Cavemanharris - 这个答案每天只会给出一行

+0

我只使用OR后的部分,它完美的作品谢谢 – Cavemanharris

1

您可以CAST到实际日期:

WHERE CAST(CONCAT(cont_date_published, ' ', cont_time_published) AS DATETIME)<NOW() 

...但这可能会阻止查询优化器使用索引(如果有的话)。另一种方法是:

WHERE cont_date_published<CURDATE() OR 
    (cont_date_published=CURDATE() AND cont_time_published<CURTIME()) 

当然,所有这些额外的工作可以用一个适当的数据库设计,使得使用一个单一的DATETIME列很容易地避免:

WHERE cont_published<NOW() 
+0

伟大的,第一个看到这一点 - +1 –

+0

ÁlvaroGonzález - 经过一些测试我选择的第一个选项没有奏效。你的解决方案在这里运作良好..Cast(Concat ..选项 – Cavemanharris