我有一个日期列表("开始",日期时间),我想选择所有日期:
today = start + 1 WEEK or
today = start + 2 WEEK or
today = start + 3 WEEK or
today = start + 4 WEEK or
today = start + 5 WEEK or
today = start + 6 WEEK
最大值是开始+6周。
有什么想法吗?
答案 0 :(得分:2)
<强>设置强>
create table example
(
id integer primary key not null auto_increment,
start datetime not null
);
insert into example ( start )
values
( date_sub(current_date, interval 1 week) ),
( date_sub(current_date, interval 2 week) ),
( date_sub(current_date, interval 3 week) ),
( date_sub(current_date, interval 4 week) ),
( date_sub(current_date, interval 5 week) ),
( date_sub(current_date, interval 6 week) ),
( date_sub(current_date, interval 6 week) ),
( date_sub(current_date, interval 4 week) ),
( date_sub(current_date, interval 9 week) ),
( date_sub(current_date, interval 12 week) )
;
<强>查询强>
select id, start
from example
where
date(start) in
(
date_sub(current_date, interval 1 week) ,
date_sub(current_date, interval 2 week) ,
date_sub(current_date, interval 3 week) ,
date_sub(current_date, interval 4 week) ,
date_sub(current_date, interval 5 week) ,
date_sub(current_date, interval 6 week)
)
;
<强>输出强>
+----+-----------------------------+
| id | start |
+----+-----------------------------+
| 1 | September, 16 2015 00:00:00 |
| 2 | September, 09 2015 00:00:00 |
| 3 | September, 02 2015 00:00:00 |
| 4 | August, 26 2015 00:00:00 |
| 5 | August, 19 2015 00:00:00 |
| 6 | August, 12 2015 00:00:00 |
| 7 | August, 12 2015 00:00:00 |
| 8 | August, 26 2015 00:00:00 |
+----+-----------------------------+
<强> sqlfiddle 强>
答案 1 :(得分:1)
我假设你想要一个WHERE
过滤器在一个星期前的这个工作日以及两个......六周之前捕获包含start
DATETIME的所有行。这就是你问题中逻辑的影响:
today = start + 1 WEEK or today = start + 2 WEEK or ...
与
意思相同start = today - 1 WEEK etc.
问题是,您正在使用start
的DATETIME值。他们不能保证start = CURDATE()
,因为他们可能不会在午夜。
因此,您需要使用DATE()
函数将它们减少到午夜值,然后再进行比较。这样的事情会起作用。
WHERE DATE(start) IN (
CURDATE() - INTERVAL 6 WEEK, CURDATE() - INTERVAL 5 WEEK, CURDATE() - INTERVAL 4 WEEK,
CURDATE() - INTERVAL 3 WEEK, CURDATE() - INTERVAL 2 WEEK, CURDATE() - INTERVAL 1 WEEK)
你也可以这样做 - 它会选出六周或更新的所有记录,但不是最近一周的记录,然后选择今天工作日的记录。
WHERE start >= CURDATE() - INTERVAL 6 WEEK
AND start < CURDATE() - 6 DAY
AND WEEKDAY(CURDATE()) = WEEKDAY(start)
如果您的表格中包含大量旧数据并且您的start
列上有索引,则第二个公式将更有效:前两个where子句为sargeable。
专业提示:在指定此类日期过滤器时,您在编写代码之前花费的精力在之前完成的工作量就越多,您完成工作的速度就越快。即使你不计算调试时间,这也是正确的。
答案 2 :(得分:0)
你能用吗?
因此...
today BETWEEN start AND start + INTERVAL 6 WEEK
那样的东西?
答案 3 :(得分:0)
尝试在mysql中运行此查询,
use dbname;
create table adddate
(
id integer primary key not null auto_increment,
initial datetime not null
)auto_increment=100;
insert into adddate ( initial )
values( DATE_ADD(current_date, interval 1 week) ),
( DATE_ADD(current_date, interval 2 week) ),
( DATE_ADD(current_date, interval 3 week) ),
( DATE_ADD(current_date, interval 4 week) ),
( DATE_ADD(current_date, interval 5 week) ),
( DATE_ADD(current_date, interval 6 week) )
;
date_add是一个SQL函数,用于在日期执行添加操作
语法为: -
DATE_ADD(date,INTERVAL expr type)
类型可以是: -
MICROSECOND, 第二, 分钟, 小时, 天, 周, 月, 25美分硬币, 年, SECOND_MICROSECOND, MINUTE_MICROSECOND, MINUTE_SECOND, HOUR_MICROSECOND, HOUR_SECOND, HOUR_MINUTE, DAY_MICROSECOND, DAY_SECOND, DAY_MINUTE, DAY_HOUR, YEAR_MONTH;