Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL中日期之间的计数_Mysql_Sql - Fatal编程技术网

Mysql SQL中日期之间的计数

Mysql SQL中日期之间的计数,mysql,sql,Mysql,Sql,我在MySQL 5.6中有下表 名称 起始日期 结束日期 弗斯特 2021-03-20 2021-03-21 第二 2021-03-20 2021-03-23 第三 2021-03-20 2021-03-20 假设您使用的是日期,而不是日期时间,那么应该可以使用。基本上,您要做的是在请求的范围内创建一个日期表,然后为每个日期创建一个笛卡尔对,其中包含您拥有的数据的日期。最后,您只需计算每个日期绑定的对的数量 --The data table DECLARE @dataTable TABLE (

我在MySQL 5.6中有下表

名称 起始日期 结束日期 弗斯特 2021-03-20 2021-03-21 第二 2021-03-20 2021-03-23 第三 2021-03-20 2021-03-20
假设您使用的是日期,而不是日期时间,那么应该可以使用。基本上,您要做的是在请求的范围内创建一个日期表,然后为每个日期创建一个笛卡尔对,其中包含您拥有的数据的日期。最后,您只需计算每个日期绑定的对的数量

--The data table 
DECLARE @dataTable TABLE (Name nvarchar(100), StartDate date, EndDate date)
INSERT INTO @dataTable VALUES('First', '2021-03-20', '2021-03-21')
INSERT INTO @dataTable VALUES('Second', '2021-03-20', '2021-03-23')
INSERT INTO @dataTable VALUES('Third', '2021-03-20', '2021-03-20')
--end

--Create a temporary table with dates in range
DECLARE @dates TABLE(dt date)    
DECLARE @dateFrom date
DECLARE @dateTo date

SET @dateFrom = '2021/03/01'
SET @dateTo = '2021/03/31'

WHILE(@dateFrom < @dateTo)
BEGIN
   SELECT @dateFrom = DATEADD(day, 1,@dateFrom)
   INSERT INTO @dates 
   SELECT @dateFrom
END
--end

--Do the thing
SELECT dt as Date, COUNT(*) as Count
FROM @dates
    inner join @dataTable ON dt >= StartDate and dt <= EndDate
GROUP BY dt
--end
——数据表
声明@dataTable表(名称nvarchar(100)、开始日期、结束日期)
在@dataTable值中插入('First','2021-03-20','2021-03-21')
插入@dataTable值('Second','2021-03-20','2021-03-23')
插入@dataTable值('Third'、'2021-03-20'、'2021-03-20')
--结束
--创建日期在范围内的临时表
声明@dates表(dt日期)
声明@dateFrom日期
声明@datetodate
设置@dateFrom='2021/03/01'
设置@dateTo='2021/03/31'
而(@dateFrom<@dateTo)
开始
选择@dateFrom=DATEADD(天,1,@dateFrom)
在@dates中插入
选择@dateFrom
结束
--结束
--做那件事
选择dt作为日期,计数(*)作为计数
从@dates开始

内部join@dataTable ON dt>=StartDate和dt一种方法是每天从一行开始,然后使用更正的子查询。假设您有一个日历表:

select c.date,
       (select count(*)
        from t
        where c.date between t.startdate and t.enddate
       ) as num_active
from calendar c
where c.date >= '2021-03-20' and c.date3 <= '2021-03-23';

MySQL版本???@SalmanA MySQL 5.6继续。试试看。然后你需要一张日历表。。。或者通过PHP或其他方式建立一个日期列表。您的代码是特定于SQL Server的,不能用于MySQL。@Akina您能解释一下为什么请解释一下。o_o您不知道SQL Server(又名MS SQL)和MySQL是两个不同的服务器吗?它们自己的语法特性在大多数情况下是不兼容的?在这种特殊情况下,MySQL主要不支持匿名代码块。我明白了。我只是假设他们是一样的,以后会记住的。谢谢!我在找这样的东西。
select c.date,
       (select count(*)
        from t
        where c.date between t.startdate and t.enddate
       ) as num_active
from (select date( '2021-03-20' + interval (@rn := @rn + 1) day) as date
      from t cross join
           (select @rn := -1) params
     ) c
where c.date >= '2021-03-20' and c.date3 <= '2021-03-23';
select c.date,
       (select count(*)
        from t
        where c.date between t.startdate and t.enddate
       ) as num_active
from (select date( '2021-03-20' ) as date union all
      select date( '2021-03-21' ) as date union all
      select date( '2021-03-22' ) as date union all
      select date( '2021-03-23' ) as date
     ) c
where c.date >= '2021-03-20' and c.date3 <= '2021-03-23';