2009-07-21 255 views
0

我有这样的SQL查询今天得到5个事件:MySQL:如何使用当前日期获取“本周的日期”?

SELECT n.nid, n.type, n.title, nr.body, nr.teaser, FROM_UNIXTIME(e.event_start) start_date, FROM_UNIXTIME(e.event_end) end_date 
FROM node n 
LEFT JOIN event e ON n.nid = e.nid 
LEFT JOIN node_revisions nr ON nr.nid = e.nid 
WHERE n.`type` = 'event' 
AND NOW() BETWEEN FROM_UNIXTIME(e.event_start) AND FROM_UNIXTIME(e.event_end) 
ORDER BY n.`created` DESC 
LIMIT 5 

然后我需要获得“本周的事件”使用“一个星期,包括‘今天’,并开始在星期天”。

如何在MySQL中做到这一点?

任何帮助将不胜感激。感谢提前:)

干杯, 马克

回答

7

您需要定义“本周”更好的 - 你的意思是一个7天的滑动窗口集中在今天或一周(包含一个“今天“)开始,例如在星期天?这完全取决于“本周”的语义,我们不可能根据模糊的表达来决定你的意思。在你提到的两种方法中,根据你的意思,其中一种或另一种(或其上的变体)将是合适的。

编辑:在OP已经澄清了评论,他的意思是“一个星期,包括‘今天’,并开始在星期天” - 我从他使用的FROM_UNIXTIME,具体的SQL方言,他的定位是演绎MySQL的。然后,WEEK(somedate, 0)是MySQL的功能,应该给他正是他想要的,见mysql's docs

具体地说,

AND WEEK(CURDATE, 0) BETWEEN WEEK(FROM_UNIXTIME(e.event_start), 0) 
         AND WEEK(FROM_UNIXTIME(e.event_end), 0) 

应该是WHERE子句OP所期待的。

+0

嗨亚历克斯,对不起我的不完整的问题,因为我不太清楚,但我确认了它,正确的是今天的“一周包括”,并在星期天开始“:) – marknt15 2009-07-21 02:51:49

1

我不确定这是否适用于SQL Server或MySQL,但在MySQL中,您可以获得当前的weekday,然后使用date_add从当前日期(开始日期)减去多天,然后使用开始日期,再次使用date_add添加7天(结束日期)。

希望有帮助,让我知道你是否需要语法帮助。

0

根据表/列名,看起来您正在使用Drupal。你有没有考虑过使用视图来实现你的目标?我无法从上下文中判断这是否是您正在编写的模块的一部分,在这种情况下,请不要插入,或者您是否希望在块中显示事件列表,在这种情况下,View应该可以为你做所有这些,而不用搞乱PHP/SQL。

0

我不知道你是否有这个选择,但出于性能的原因,它可能会更好地做你的程序代码中的日期计算。如果您在WHERE子句中使用列上的函数,MySQL不能使用索引。一个简单的例子:http://netfactory.dk/2004/12/13/mysql-date-functions-and-indexes/ 大多数语言应该有适合日期/时间操作的体面函数/库。

相关问题