SQL 查询两个日期之间或之前的第一个日期
SQL Query Between 2 Dates or first one before
好的,所以我想找到一段时间内所有活跃的价格。
我有一个 table "prices" 每个价格和激活日期。
╔══════════════╦═════════════════╗
║ price_number ║ activation_date ║
╠══════════════╬═════════════════╣
║ Price 1 ║ 2014-12-03 ║
║ Price 2 ║ 2014-12-07 ║
║ Price 3 ║ 2014-12-12 ║
║ Price 4 ║ 2014-12-25 ║
╚══════════════╩═════════════════╝
现在我想 select 2014-12-09 和 2014-12-14 之间的活跃价格。
结果应显示价格 2 和价格 3(价格 2 因为它在 2014-12-09 和 2014-12-12 之间处于活动状态,直到价格 3 被激活)。
所以基本上我想要激活日期在 2014-12-09 和 2014-12-14 之间或 2014-12-09 之前的第一个激活日期的价格。
到目前为止我得到了什么:
SELECT * FROM prices
WHERE (activation_date BETWEEN '2014-12-09' AND '2014-12-14')
OR (Something I can't find)
我正在使用 MySQL 5.5
这有点复杂,因为前一行的条件。这是使用 union all
的一种方法:
(SELECT p.*
FROM prices p
WHERE activation_date BETWEEN '2014-12-09' AND '2014-12-14'
) UNION ALL
(SELECT p.*
FROM prices p
WHERE activation_date < '2014-12-09' AND
NOT EXISTS (SELECT 1 FROM prices p2 WHERE activation_date BETWEEN '2014-12-09' AND '2014-12-14')
ORDER BY activation_date DESC
LIMIT 1
);
另一种方法是....
select * from
(
select p1.price_number,p1.activation_date, min(dateadd(day,datediff(day,p1.activation_date,p2.activation_date)-1,p1.activation_date)) 'activationdate_end' from prices p1
inner join prices p2 on p1.activation_date < p2.activation_date
group by p1.price_number,p1.activation_date
) A where ('2014-12-09' between A.activation_date and A.activationdate_end) or '2014-12-14' between A.activation_date and A.activationdate_end
这是在 MSSQL 中...但我相信它也可以在 MySQL
中完成
好的,所以我想找到一段时间内所有活跃的价格。 我有一个 table "prices" 每个价格和激活日期。
╔══════════════╦═════════════════╗
║ price_number ║ activation_date ║
╠══════════════╬═════════════════╣
║ Price 1 ║ 2014-12-03 ║
║ Price 2 ║ 2014-12-07 ║
║ Price 3 ║ 2014-12-12 ║
║ Price 4 ║ 2014-12-25 ║
╚══════════════╩═════════════════╝
现在我想 select 2014-12-09 和 2014-12-14 之间的活跃价格。
结果应显示价格 2 和价格 3(价格 2 因为它在 2014-12-09 和 2014-12-12 之间处于活动状态,直到价格 3 被激活)。
所以基本上我想要激活日期在 2014-12-09 和 2014-12-14 之间或 2014-12-09 之前的第一个激活日期的价格。
到目前为止我得到了什么:
SELECT * FROM prices
WHERE (activation_date BETWEEN '2014-12-09' AND '2014-12-14')
OR (Something I can't find)
我正在使用 MySQL 5.5
这有点复杂,因为前一行的条件。这是使用 union all
的一种方法:
(SELECT p.*
FROM prices p
WHERE activation_date BETWEEN '2014-12-09' AND '2014-12-14'
) UNION ALL
(SELECT p.*
FROM prices p
WHERE activation_date < '2014-12-09' AND
NOT EXISTS (SELECT 1 FROM prices p2 WHERE activation_date BETWEEN '2014-12-09' AND '2014-12-14')
ORDER BY activation_date DESC
LIMIT 1
);
另一种方法是....
select * from
(
select p1.price_number,p1.activation_date, min(dateadd(day,datediff(day,p1.activation_date,p2.activation_date)-1,p1.activation_date)) 'activationdate_end' from prices p1
inner join prices p2 on p1.activation_date < p2.activation_date
group by p1.price_number,p1.activation_date
) A where ('2014-12-09' between A.activation_date and A.activationdate_end) or '2014-12-14' between A.activation_date and A.activationdate_end
这是在 MSSQL 中...但我相信它也可以在 MySQL
中完成