我需要一个查询,它将返回两个日期之间每个星期一的日期。它旨在成为另一个计算每周交易(周一至周日)的查询的基础,它应该能够代表没有任何交易的周数。
这意味着它不能依赖于交易表中的现有数据,因为在没有任何交易的情况下几周就没有代表。
例如: 从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
这就是为什么我不能依赖数据本身,并且需要一个查询来生成两个给定日期之间的每个星期一。有什么建议吗?
答案 0 :(得分:0)
所以,我有一部分工作......它没有填充一个空的一周。但这会得到每个事件碰巧分组的那一周。 我会不建议你在MySQL中完成所有这些...你应该用另一种编程语言来做这件事
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');
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和周,如果它没有从这个查询返回
答案 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)
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;