只显示MySQL的未来数据库记录



我试图仅显示从当前日期起提前两周的记录。starttimedatetime数据类型存储在数据库中。

我有这个,

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

相关内容

  • 没有找到相关文章

最新更新