我试图从当前日期开始提前两周显示记录。 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()
有人能告诉我它有什么问题吗?
答案 0 :(得分:1)
似乎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
答案 1 :(得分:0)
正如我所说,我认为没有理由使用YEARWEEK
功能。您需要将开始日期设置为今天CURDATE()
并加上2周时段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)
答案 2 :(得分:0)
你如何定义“提前两周”?我们的正常倾向是“在两周内”思考,这将在14天之后完成。
WHERE starttime >= NOW()
AND starttime < NOW() + INTERVAL 14 DAY
但原始查询使用YEARWEEK
函数,其行为略有不同。
如果今天是1015年5月21日星期四。starttime
应该包含的日期范围是多少?
对于现在或将来的日期时间,我们可以这样做:
WHERE starttime >= NOW()
(如果我们要排除与>
完全匹配的>=
值,我们只能startime
而非NOW()
。
问题是,有点“提前两周”。添加14天或2周将使我们达到2015年6月4日星期四。看起来您可能还想包括星期五和星期六,6月5日和6日。 (直到6月的星期日。)
我们可以使用表达式返回“从今天起14天后的星期日”
如果是星期天,我们只使用该日期。 (为方便起见,我们认为增加0天)。如果是星期六,我们需要加1天。如果是周五,请加2天,......周一,再加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
列中存储的值进行比较。