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

MySQL查询返回从给定日期到现在的每个星期日的日期(不依赖表中的数据),mysql,date,select,range,dayofweek,Mysql,Date,Select,Range,Dayofweek,我需要一个查询,将返回两个日期之间的每个星期一的日期。它旨在基于另一个查询,该查询统计周一到周日的每周交易,并且它应该能够表示没有任何交易的周数 这意味着它不能依赖transactions表中的现有数据,因为在没有任何事务的情况下,那里没有表示 例如: 从2014年7月21日星期一开始的3周内,我需要一个返回以下内容的查询: 2014-07-21 2014-07-28 2014-08-04 假设我的交易记录日期如下: 2014-07-22 2014-07-23 2014-07-25 2014-0

我需要一个查询,将返回两个日期之间的每个星期一的日期。它旨在基于另一个查询,该查询统计周一到周日的每周交易,并且它应该能够表示没有任何交易的周数

这意味着它不能依赖transactions表中的现有数据,因为在没有任何事务的情况下,那里没有表示

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

2014-07-21

2014-07-28

2014-08-04

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

2014-07-22

2014-07-23

2014-07-25

2014-08-05

我想编写一个查询,返回每周的事务总数:

2014-07-21=>3

2014-07-28=>0

2014-08-04=>1


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

所以,我做了一部分。。这不是一个空的星期。但这一周,每个事件都会发生在分组中。 我不建议您在MySQL中完成所有这些。。你应该用另一种编程语言来做

设置: 查询: 输出: 从这里开始,您应该用另一种编程语言完成其余的工作。建立一个星期的列表。。。然后比较。。如果此查询未返回0和周,请输入0


好吧,如果你只需要接下来的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)
如果你使用另一张桌子,你可以让它工作,这也有额外的优势,更可调整,可能更快

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
找到了! 受以下问题的答复启发—— 下面的查询凭空返回!两个日期之间的每周一:

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

下面的查询给出了答案-

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;

我很难理解你想做什么。如果我理解正确的话,这似乎是你应该在MySQL之外做的事情,当然,无论你使用什么程序,如果你想做这个MySQL,构建一个包含所有可能日期的表的开销将是适度的。它需要在MySQL上完成,我想在不构建这样一个表的情况下实现这一点……好吧,老实说,因为我确信这是可以做到的,我太好奇了,不知道怎么做。不可能,没有办法。而且,在我工作的地方,我无法轻松地影响数据库,只能查询它……MySQL用于存储和检索数据。你不能轻易地找回那些不存在的东西。您可以使用工具表和/或联合等技巧来伪造一个系列,但这些都是技巧。OP已指定它不基于表数据,因此这不起作用
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
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
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;