日期范围之间的 MySQL
Posted
技术标签:
【中文标题】日期范围之间的 MySQL【英文标题】:MySQL BETWEEN DATE RANGE 【发布时间】:2013-01-03 02:25:34 【问题描述】:我有一种情况需要根据下表提取交货日期(示例)
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?
【问题讨论】:
【参考方案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
【讨论】:
我知道这是如何工作的。我唯一担心的是,您将如何仅显示从新的一年开始创造的就业机会?出于某种原因,当我添加AND delivery_date>='2013-01-01'
时,什么都没有出现...
如果您的交货日期早于 2013 年 1 月 1 日,则表达式 min(delivery_date)
不会做正确的事情。请改用文字日期。
@DimitriTopaloglou 我同意 Catcall,如果您不确定日期范围,那么您应该使用文字字符串作为范围的值。因此,将 startdate 传递到您的查询中,然后将 21 天添加到该值作为结束日期。查看我的编辑【参考方案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
【讨论】:
【参考方案3】: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())
【讨论】:
以上是关于日期范围之间的 MySQL的主要内容,如果未能解决你的问题,请参考以下文章