SQL Query在两个日期之间获取每天的价格

时间:2015-11-02 08:36:11

标签: mysql sql

定价

enter image description here

我想要的是提供start_date&一个end_date,以便在这两个日期之间获得每天的price_per_day

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

2015-05-30 | 24.00

2015-05-31 | 24.00

2015-06-01 | 27.00

2015-06-02 | 27.00

更新

即使这个输出对我来说还可以

24.00

24.00

27.00

27.00

3 个答案:

答案 0 :(得分:1)

您必须选择的日期大于“从”日期开始,小于“收件人”日期。我没有测试就发布了以下内容,请测试并在出现任何错误时通知我。

var fooString = foo ? "foo is true" : "foo is false";
$"test {fooString}";

编辑: 请确保start_date和end_date的类型与提供的日期相同。为了安全起见,您还可以将它们转换为datetime或convert(varchar,yourDatevariable,103),但您必须在条件的两边应用它。

答案 1 :(得分:0)

您的请求应如下所示:

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

但要打印出这两者之间的日期,我不知道。

这可能有助于您思考:

ggplot histogram with transparency

答案 2 :(得分:0)

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

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

因此,选项是使用一组联合查询来生成一系列数字。例如,以下将返回10行,数字为0到9: -

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