1

我有一个场景,我需要根据下表提取交货日期(示例)

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。2 月之后的日期并不重要,因为它们不在我的 21 日期范围内。例如,如果它是一个 5 天的范围,那么当然不会包括 2013-01-25,而只会出现最早的日期。

这是我的主要 SQL 子句,它只显示从今年开始的工作:

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

是否可以使用 1 个 SQL 查询来完成此操作,或者我必须同时使用 PHP 吗?

4

3 回答 3

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
于 2013-01-03T02:29:11.163 回答
2

您可以使用以下内容:

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

如果您担心日期不正确,如果您使用查询,那么最好将开始日期传递给您的查询,然后添加 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

于 2013-01-03T02:31:08.057 回答
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... 更改,如果它应该引用date列 instaed。)

如果意图仅显示delivery_date从今天开始的值,则将文字更改为'2013-01-01'返回当前日期的表达式,例如DATE(NOW())

于 2013-01-03T04:47:30.473 回答