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