1

下の表に基づいて納期を引き上げる必要があるシナリオがあります(例)

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

私がやろうとしているのは、最も早いものから始まるすべての配達日(この場合は2013-01-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 FiddlewithDemoを参照してください

日付が正しくないことが心配な場合、クエリを使用する場合は、クエリに開始日を渡してから、21日を追加して終了日を取得するのが最適な場合があります。これに似ています:

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

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

SQL FiddlewithDemoを参照してください

于 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

今日以降の値のみを表示することを目的としている場合はdelivery_date、リテラル'2013-01-01'を現在の日付を返す式に変更します。DATE(NOW())

于 2013-01-03T04:47:30.473 に答える