在此工作日选择过去的日期

时间:2015-09-23 09:11:31

标签: mysql sql datetime

我有一个日期列表("开始",日期时间),我想选择所有日期:

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周。

有什么想法吗?

4 个答案:

答案 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;