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

Display only future database records with MySQL

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

使用开始时间代替 formatted_date

正如我所说,我认为没有理由使用 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)

你如何定义"two weeks in advance"?我们的正常倾向是想 "within two weeks",也就是从现在起 14 天之前。

 WHERE starttime >= NOW()
   AND starttime  < NOW() + INTERVAL 14 DAY

但原始查询使用的是 YEARWEEK 函数,其行为有点不同。

如果今天是 1015 年 5 月 21 日,星期四。starttime 应该属于什么日期范围?

对于现在或将来的日期时间,我们可以这样做:

 WHERE starttime >= NOW()

(如果我们想排除与 NOW() 完全匹配的 startime 值,我们可以只执行 > 而不是 >=

问题是,关于 "two weeks in advance" 的一点。加上 14 天或 2 周,我们将得到 2015 年 6 月 4 日星期四。看起来您可能还想包括 6 月 5 日和 6 日星期五和星期六。 (截至 6 月星期日)

我们可以用一个表达式来return"Sunday on or following 14 days from today"

如果是星期天,我们就使用那个日期。 (为方便起见,我们将其视为添加 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 

当我们在一侧引用 table 中的裸列并在另一侧进行回转和操作时,阅读和理解查询正在做的事情要容易得多。它也更容易测试。而且,也许更重要的是,它允许 MySQL 在 suitable 索引上有效地使用 "range scan" 操作,而不是必须在 [=64] 中的每一行上计算一个函数=].

如果今天是“2015-05-21”,而你所说的 "two weeks in advance" 的意思是从现在开始到第二个星期日(星期日,2015 年 5 月 31 日...从现在开始的 1 周零 3 天现在)只需将 14 替换为 7.

同样,这实际上取决于您如何定义 "two weeks in advance",以及您如何确定结束日期边界是什么。一旦你可以定义它,你就可以编写一个 return 值的表达式,并与存储在 starttime 列中的值进行比较。