使用MySQL仅显示未来的数据库记录

时间:2015-05-21 23:23:39

标签: php mysql sql datetime syntax-error

我试图从当前日期开始提前两周显示记录。 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()

有人能告诉我它有什么问题吗?

3 个答案:

答案 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列中存储的值进行比较。