2015-11-02 82 views
0

定价之间SQL查询来获取每天每价格2个日期

enter image description here

我想要什么,是为了获得price_per_day那些之间每天提供start_date &的end_date 2日期。

例如,如果我设定为start_date = 2015-05-30 & end_date = 2015-06-02,所期望的输出是

2015年5月30日| 24.00

2015-05-31 | 24.00

2015-06-01 | 27.00

2015-06-02 | 27.00

UPDATE:

即使这个输出将是确定的,我

24.00

24.00

27.00

27.00

+2

所有日期的日历表可能是有用的。 – jarlh

+0

@jarlh不幸的是,这不是我的选择,我必须在现有的分贝工作。 – Makis

+0

然后,您必须生成一个“爆炸”日期范围。如果你有一个数字表,你可以使用它,否则尝试其中的一些技巧,如递归CTE或交叉连接系统表。一旦你得到了数字列表,你可以生成一个日期列表,并对其进行数学运算。 – Bridge

回答

0

你的要求应该是这个样子:

SELECT Price FROM Pricing WHERE start_date = 2015-05-30 AND end_date = 2015-06-02 

但打印出来everydate日这两个之间,我不知道。

这可以帮助你认为:

How to list all dates between two dates

1

你必须选择日期比“至”日期大于说,“从”日期和较小。我发布了以下未经测试的内容,请在出现任何错误的情况下进行测试并通知我。

SELECT Price FROM Pricing WHERE start_date >= '2015-05-30' AND end_date <= '2015-06-02' 

编辑: 请确保起始日期日期和结束日期具有相同的类型提供的日期。为了安全起见,您还可以将它们转换为日期时间或转换(varchar,yourDatevariable,103),但您必须将其应用于条件的两侧。

0

你需要做的是有一个日期范围(即每行日期1行)。这可以通过几种方式完成。可能效率最高的是有一个日历表,但是如果你不能添加不可能的新表。

你可以有一个数字表并将其添加到每行的开始日期,但这又需要一个新表。

这样的选项是有一组联合查询来生成一个数字范围。例如,下面将返回数字0到9的10行: -

SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 

可以交叉连接彼此这样子查询,以产生更大范围的数字,并添加到您的起始日期,其中结果小于等于结束日期: -

SELECT id, start_date, end_date, price_per_day, DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) AS aDay 
FROM pricing 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds 
WHERE DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) <= end_date 

以上将应付日期之间长达1000天。易于扩展以应付10000天以上,但会变得更慢。

检查您感兴趣的日期范围时,您可以就用,作为一个子查询: -

SELECT aDay, price_per_day 
FROM 
(
    SELECT id, start_date, end_date, price_per_day, DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) AS aDay 
    FROM pricing 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds 
    WHERE DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) <= end_date 
) sub0 
WHERE aDay BETWEEN '2015-05-30' AND '2015-06-02' 
ORDER BY aDay