2013-01-03 121 views
1

我遇到的情况,我需要根据下表拉起交货日期(例)MySQL之间的日期范围

job_id | delivery_date 
1  | 2013-01-12 
2  | 2013-01-25 
3  | 2013-02-15 

我想要做的是显示用户所有的交付日期是从最早开始(在这种情况下将是2013年1月12日)并为此再添加21天。基本上,我希望它能显示出来,最早的日期是2013-01-12和2013-01-25开始日期。由于它们不在我的21日期范围内,因此2月日期之后的日期并不重要。例如,如果这是一个5天的范围,那么2013-01-25当然不会被包括在内,只会显示最早的日期。

这里是主要的SQL子句我有这只能说明工作从今年开始推进:

SELECT date, delivery_date 
FROM `job_sheet` 
WHERE print_status IS NULL 
    AND job_sheet.date>'2013-01-01' 

是否有可能与SQL语句来做到这一点,或者我必须使用PHP的混合走呢?

回答

1

您可以使用以下方法:

select * 
from job_sheet 
where print_status IS NULL 
    and delivery_date >= (select min(delivery_date) 
         from job_sheet) 
    and delivery_date <= (select date_add(min(delivery_date), interval 21 day) 
         from job_sheet) 

SQL Fiddle with Demo

如果你担心不被正确的日期,如果您使用的查询,那么它可能是最好的传递查询的开始日期,然后添加21天以获取结束日期。与此相似:

set @a='2013-01-01'; 

select * 
from job_sheet 
where delivery_date >= @a 
    and delivery_date <= date_add(@a, interval 21 day) 

SQL Fiddle with Demo

+0

我明白这是如何工作的。我唯一担心的是,你将如何展示从新年开始创造的工作?出于某种原因,当我添加'AND delivery_date> ='2013-01-01'时,什么都没有显示出来...... – Dimitri

+0

如果您在2013-01-01之前有交货日期,则表达式'min(delivery_date) '不会做正确的事情。改用文字日期。 –

+0

@DimitriTopaloglou我同意Catcall,如果您不确定日期范围,那么您应该使用文字字符串作为范围的值。因此,传入查询startdate,然后将21天添加到结束日期的该值。看我的编辑 – Taryn

2
SELECT date, 
     delivery_date 
FROM job_sheet 
WHERE print_status IS NULL 
AND job_sheet.date BETWEEN (SELECT MIN(date) FROM job_sheet) AND 
          (SELECT MIN(date) FROM job_sheet) + INTERVAL 21 DAY 
1
SELECT j.job_id 
    , j.delivery_date 
    FROM `job_sheet` j 
    JOIN (SELECT MIN(d.delivery_date) AS earliest_date 
      FROM `job_sheet` d 
      WHERE d.delivery_date >= '2013-01-01' 
     ) e 
    ON j.delivery_date >= e.earliest_date 
    AND j.delivery_date < DATE_ADD(e.earliest_date, INTERVAL 22 DAY) 
    AND j.print_status IS NULL 
ORDER BY j.delivery_date 

(原始查询对job_sheet.date一个谓语;上述引用d.delivery_date查询......改变,如果它被认为是

如果意图是只显示delivery_date tod值ay forward,然后将字面值'2013-01-01'更改为返回当前日期的表达式,例如DATE(NOW())