仅显示 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
列中的值进行比较。
我试图只显示从当前日期开始提前两周的记录。 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
列中的值进行比较。