MySQL查询返回给定日期和现在之间每个星期日的日期(不依赖于表中的数据)

时间:2014-08-07 15:52:52

标签: mysql date select range dayofweek

我需要一个查询,它将返回两个日期之间每个星期一的日期。它旨在成为另一个计算每周交易(周一至周日)的查询的基础,它应该能够代表没有任何交易的周数。

这意味着它不能依赖于交易表中的现有数据,因为在没有任何交易的情况下几周就没有代表。

例如: 从2014年7月21日星期一开始的3周 - 我需要一个返回以下内容的查询:

  

2014年7月21日

     

2014年7月28日

     

2014年8月4日

假设我的交易记录在以下日期:

  

2014年7月22日

     

2014年7月23日

     

2014-07-25

     

2014年8月5日

我想编写一个返回每周汇总数量的查询:

  

2014-07-21 => 3

     

2014-07-28 => 0

     

2014-08-04 => 1

这就是为什么我不能依赖数据本身,并且需要一个查询来生成两个给定日期之间的每个星期一。有什么建议吗?

4 个答案:

答案 0 :(得分:0)

所以,我有一部分工作......它没有填充一个空的一周。但这会得到每个事件碰巧分组的那一周。 我会建议你在MySQL中完成所有这些...你应该用另一种编程语言来做这件事

SETUP:

create table time_date (id int, date_part date);
insert into time_date values
(1, '2014-07-22'),
(2, '2014-07-23'),
(3, '2014-07-25'),
(4, '2014-08-05');

QUERY:

SELECT 
    FROM_DAYS(TO_DAYS(date_part) - MOD(TO_DAYS(date_part) -2, 7)) as 'Week'
  , COUNT(*) as 'Num Per Week' 
FROM time_date
GROUP BY FROM_DAYS(TO_DAYS(date_part) - MOD(TO_DAYS(date_part) -2, 7)) ;

输出:

   Week     Num Per Week
2014-07-21       3
2014-08-04       1

从这里你应该用另一种编程语言完成剩下的工作。建立一个周列表...然后比较..放入0和周,如果它没有从这个查询返回

DEMO

答案 1 :(得分:0)

好的,如果你只需要接下来的3个星期,而且我们不担心一周的哪一天,而且你不想再制作另一张桌子,{{3}将解决你的问题。

SET @startdate = '2014-07-21';
SET @seconddate = DATE_ADD(@startdate,INTERVAL 7 DAY);
SET @thirddate = DATE_ADD(@seconddate,INTERVAL 7 DAY);

SELECT count(id),@startdate as week FROM transactions 
WHERE transdate BETWEEN @startdate AND @seconddate
UNION 
SELECT count(id),@seconddate as week from transactions
WHERE transdate BETWEEN @seconddate AND @thirddate
UNION
SELECT count(id),@thirddate as week FROM transactions
WHERE transdate BETWEEN @thirddate AND DATE_ADD(@thirddate,INTERVAL 7 DAY)

如果你使用另一张桌子,你可以让它与this query一起使用(它还具有更多可调节且可能更快的附加优势)

SELECT count(transactions.id), weekstarts.start
FROM weekstarts LEFT JOIN transactions ON
transactions.transdate 
BETWEEN weekstarts.start AND DATE_ADD(weekstarts.start,INTERVAL 7 DAY)
WHERE weekstarts.start BETWEEN '2014-07-21' AND DATE_ADD('2014-07-21',INTERVAL 14 DAY)
GROUP BY weekstarts.start

答案 2 :(得分:0)

发现它! 灵感来自对this thread的回复 - 以下查询在2个日期之间的每个星期一返回(凭空!):

select  * 
  from (
    select  date_add('2010-01-01', INTERVAL n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date 
      from  (select 0 as num
               union all select 1
               union all select 2
               union all select 3
               union all select 4
               union all select 5
               union all select 6
               union all select 7
               union all select 8
               union all select 9) n1,
            (select 0 as num
               union all select 1
               union all select 2
               union all select 3
               union all select 4
               union all select 5
               union all select 6
               union all select 7
               union all select 8
               union all select 9) n2,
            (select 0 as num
               union all select 1
               union all select 2
               union all select 3
               union all select 4
               union all select 5
               union all select 6
               union all select 7
               union all select 8
               union all select 9) n3,
            (select 0 as num
               union all select 1
               union all select 2
               union all select 3
               union all select 4
               union all select 5
               union all select 6
               union all select 7
               union all select 8
               union all select 9) n4
            ) a
where date >= '2014-07-21' and date < NOW()
  and weekday(date) = 0
order by date

答案 3 :(得分:-1)

以下查询为您提供答案 -

create table transactions
 ( id integer,
 trans_date date
 );

select DATE_ADD(trans_date, INTERVAL(-WEEKDAY(trans_date)) DAY) 
Week_start_date,count(*) total_transactions from transactions
group by 1;