我试图仅显示从当前日期起提前两周的记录。starttime
以datetime
数据类型存储在数据库中。
我有这个,
SELECT id, date_format(starttime, '%d-%m-%Y %H:%i') AS formatted_start, date_format(starttime, '%Y-%m-%d') AS formatted_date,
date_format(endtime, ' %H:%i') AS formatted_end
FROM timedates WHERE user_id = 1 AND `status`='' AND YEARWEEK(formatted_date, 0) IN (YEARWEEK(NOW(), 0),
YEARWEEK(DATE_ADD(NOW(), INTERVAL 2 WEEK), 0))
但是我得到一个语法错误YEARWEEK(formatted_date, 0) IN (YEARWEEK(NOW(), 0) AND YEARWEEK(DATE_ADD(NOW()
MySQL似乎不支持where子句中的计算列:
试
SELECT id, date_format(starttime, '%d-%m-%Y %H:%i') AS formatted_start,
date_format(starttime, '%Y-%m-%d') AS formatted_date,
date_format(endtime, ' %H:%i') AS formatted_end
FROM timedates
WHERE user_id = 1 AND `status`='' AND
YEARWEEK(starttime, 0) IN (
YEARWEEK(DATE_ADD(NOW(), INTERVAL 1 WEEK), 0),
YEARWEEK(DATE_ADD(NOW(), INTERVAL 2 WEEK), 0))
使用starttime代替formatted_date
正如我所说,我认为没有理由使用YEARWEEK
函数。您需要将起始日期设置为今天,即CURDATE()
,加上两周的时间,即DATE_ADD(CURDATE(), INTERVAL 2 WEEK)
,然后我们只需检查starttime
是否在这两个日期之间。
SELECT id, date_format(starttime, '%d-%m-%Y %H:%i') AS formatted_start,
date_format(starttime, '%Y-%m-%d') AS formatted_date,
date_format(endtime, ' %H:%i') AS formatted_end
FROM timedates
WHERE user_id = 1
AND `status`=''
AND DATE(starttime) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 2 WEEK)
如何定义"提前两周"?我们通常倾向于认为"两周内",也就是从现在起14天之前。
WHERE starttime >= NOW()
AND starttime < NOW() + INTERVAL 14 DAY
但原来的查询是使用YEARWEEK
函数,与之行为有点不同。
如果今天是星期四,5月21日,2015。starttime
的日期范围是什么?
对于现在或将来的日期时间,我们可以这样做:
WHERE starttime >= NOW()
(如果我们想要排除与NOW()
完全匹配的startime
值,我们可以只做>
而不是>=
)
问题是,关于"提前两周"的部分。再加上14天,也就是2周,我们就能算到2015年6月4日,星期四。看起来你可能还想包括周五和周六,6月5日和6日。(截止到6月6日星期日)
可以使用表达式返回"从今天起14天或之后的星期天"
如果是星期天,我们就用那个日期。(为方便起见,我们认为是增加0天)。如果是星期六,我们需要加1天。如果是星期五,加两天,……星期一,加6天。
方便地,表达式 6 - WEEKDAY(NOW())
给出了我们需要在今天的日期上加到下一个星期日的天数。
参考:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html function_weekday
我们可能想要在午夜关闭时间,我们可以使用DATE()
函数来做到这一点。
-- startime values on or after now and before midnight
-- of the first sunday on or after the date two weeks from now
WHERE starttime >= NOW()
AND starttime < DATE(NOW()) + INTERVAL 14+6-WEEKDAY(NOW()) DAY
当我们在一边引用表中的裸列,在另一边进行旋转和操作时,阅读和理解查询正在做什么要容易得多。它也更容易测试。而且,也许更重要的是,它允许MySQL在合适的索引上有效地使用"范围扫描"操作,而不是必须对表中的每一行求值一个函数。
如果今天是"2015-05-21",你所说的"提前两周"是指从现在起的第二个星期日(星期日,2015年5月31日…从现在起1周零3天)把14
换成7
。
同样,这真的取决于你如何定义"提前两周",你如何确定结束日期的界限。一旦定义了这个,就可以编写一个返回值的表达式,并与存储在starttime
列中的值进行比较。