将所有日期转换为日期范围

时间:2015-11-24 21:37:44

标签: mysql date

我的数据库中有一个名为sale的表:

SaleID (PK)
DateFrom
DateTo
TotalPrice
AveragePrice

然后我在一个具有以下结构的同一个数据库中有一个测试表:

date from

在销售中,表格我有60,000个日期。在我的测试表中,我希望date toDateFrom - 1st January 2016. DateTo - 7th January 2016. AveragePrice - 20,000 为一周。例如:

SELECT * FROM sale where date between 'January 1 2016' and 'January 7 2016'

这将允许我查看每周的平均销售额。有没有办法在7天范围内拍卖所有日期并将其插入测试?我无法想出一个可以使这个工作的查询。我知道如何进行一周的查询:

{{1}}

但是,我不确定如何将2016年1月1日作为FromDate和2016年1月7日作为ToDate插入,并且每7天执行此操作。有可能吗?

2 个答案:

答案 0 :(得分:2)

这个不起作用。 2014年的上周说是第1周

SELECT 
      YEAR(`Date`),
      WEEKOFYEAR(`Date`),
      AVG(TotalPrice)
FROM Sales
GROUP BY  YEAR(`Date`),
          WEEKOFYEAR(`Date`)

January 1 2016将有一周不到7天

如果你想要7天的周,你可以使用:

<强> SQL Fiddle Demo

SELECT 
      SUBDATE(`Date`, WEEKDAY(`Date`)) MondayWeek,
      AVG(`TotalPrice`)
FROM Sales
GROUP BY SUBDATE(`Date`, WEEKDAY(`Date`))

我包含另一个查询以查看此工作

SELECT `Date`, WEEKDAY(`Date`), YEAR(`Date`), WEEKOFYEAR(`Date`),  yearWeek(`Date`)
FROM Sales
order by `Date`;

<强>输出

|       Date | WEEKDAY(`Date`) | YEAR(`Date`) | WEEKOFYEAR(`Date`) | YEARWEEK(`Date`) |
|------------|-----------------|--------------|--------------------|------------------|
| 2014-12-24 |               2 |         2014 |                 52 |           201451 |
| 2014-12-25 |               3 |         2014 |                 52 |           201451 |
| 2014-12-26 |               4 |         2014 |                 52 |           201451 |
| 2014-12-27 |               5 |         2014 |                 52 |           201451 |
| 2014-12-28 |               6 |         2014 |                 52 |           201452 |
| 2014-12-29 |               0 |         2014 |  <===>           1 |           201452 | ***
| 2014-12-30 |               1 |         2014 |                  1 |           201452 |
| 2014-12-31 |               2 |         2014 |                  1 |           201452 |
| 2015-01-01 |               3 |         2015 |  <===>           1 |           201452 | ***
| 2015-01-02 |               4 |         2015 |                  1 |           201452 |
| 2015-01-03 |               5 |         2015 |                  1 |           201452 |
| 2015-01-04 |               6 |         2015 |                  1 |           201501 | ***
| 2015-01-05 |               0 |         2015 |                  2 |           201501 |
| 2015-01-06 |               1 |         2015 |                  2 |           201501 |
| 2015-01-07 |               2 |         2015 |                  2 |           201501 |
| 2015-01-08 |               3 |         2015 |                  2 |           201501 |
| 2015-01-09 |               4 |         2015 |                  2 |           201501 |
| 2015-01-10 |               5 |         2015 |                  2 |           201501 |
| 2015-01-11 |               6 |         2015 |                  2 |           201502 |
| 2015-01-12 |               0 |         2015 |                  3 |           201502 |
| 2015-01-13 |               1 |         2015 |                  3 |           201502 |
| 2015-01-14 |               2 |         2015 |                  3 |           201502 |
| 2015-01-15 |               3 |         2015 |                  3 |           201502 |
| 2015-01-16 |               4 |         2015 |                  3 |           201502 |

答案 1 :(得分:0)

罗马有很多方法,所以有解决这个问题的方法。 在我看来,最佳方式是引入日历表。

例如:

DateSQL    DateText   Week Year Month Day Weekday  Period YearPeriod MonthPeriod
2014-12-29 29-12-2014    1 2014    12  29 Monday        1       2015           1
2014-12-30 30-12-2014    1 2014    12  30 Tuesday       1       2015           1
2014-12-31 31-12-2014    1 2014    12  31 Wednesday     1       2015           1
2015-01-01 01-01-2015    1 2015     1   1 Thursday      1       2015           1
2015-01-02 02-01-2015    1 2015     1   2 Friday        1       2015           1
2015-01-03 03-01-2015    1 2015     1   3 Saturday      1       2015           1
2015-01-04 04-01-2015    1 2015     1   4 Sunday        1       2015           1
2015-01-05 05-01-2015    2 2015     1   5 Monday        1       2015           1

它可以解决查询中的很多问题,以确定几个日期问题。例如:29-12-2014属于2015年第1周。 或者:2015年12月31日属于2015年第53周,但(在我们的例子中)属于第13期(而不是14周,在我们的4周时间内)。