[英]How to calculate days between two dates,
Is it possible in MySQL to easily to get the number of days between two dates, group by months and then disperse those days between the months, so that when I group by month, I get to see how many days inbetween two those two dates fall into each month. 在MySQL中是否可以轻松地获取两个日期之间的天数,按月分组,然后分散月份之间的天数,以便当我按月分组时,我可以看到两个日期之间的多少天下降了进入每个月。
Example: creation 05.05.2014 to expiration 06.06.2014 returns 32 days. 示例:创建05.05.2014至到期06.06.2014返回32天。 I want to display this as:
我想显示为:
May: 26 days June: 5 days 5月:26天6月:5天
So far I've got: 到目前为止,我已经:
SELECT MONTHNAME(date) as month_name,
SUM(DATEDIFF(expiration, date)) AS num_days
FROM reservations
GROUP BY month_name
But it doesn't disperse the days corretly by month, just drop them all into the group-by -start-date-month, obviously. 但是,它并不能按月正确地分散日期,而只是将它们全部按-start-date-month分组。 Any ideas would be highly appriciated.
任何想法都会得到高度重视。
I would build a comprehensive date temp table (or CTE) first. 我将首先构建一个全面的日期临时表(或CTE)。
From there you can select what you'd like, and group it however suits your needs. 在这里,您可以选择所需的内容,并根据需要将其分组。
IF OBJECT_ID('TEMPDB..#Dates') IS NOT NULL DROP TABLE #Dates
DECLARE @StartDate DATETIME, @EndDate DATETIME
SET @StartDate = '05/05/2014'
SET @EndDate = '06/06/2014'
;WITH Dates AS
(
SELECT CAST(CONVERT(VARCHAR(8), @StartDate,112) AS INT) AS DateId
, CAST(@StartDate AS DATE) AS Date
, CAST(@StartDate AS DATETIME) AS DateTime
, DATEPART(QUARTER, @StartDate) AS QuarterId
, 'Q' + CAST(DATEPART(QUARTER,@StartDate) AS CHAR(1)) AS Quarter
, DATEPART(MONTH, @StartDate) AS MonthId
, DATENAME(MONTH, @StartDate) AS Month
, DATEPART(DAY, @StartDate) AS Day
, DATEPART(YEAR, @StartDate) AS Year
, DATENAME(DW,@StartDate) AS DayOfWeek
, DATEPART(DAYOFYEAR, @StartDate) AS DayOfYear
UNION ALL
SELECT CAST(CONVERT(VARCHAR(8),DATEADD(DAY, 1, D.DateTime), 112) AS INT) ASDateId
, CAST(DATEADD(DAY, 1, D.DateTime) AS DATE) AS Date
, CAST(DATEADD(DAY, 1, D.DateTime) AS DATETIME) AS DateTime
, DATEPART(QUARTER,DATEADD(DAY,1,D.DateTime)) AS QuarterId
,'Q'+CAST(DATEPART(QUARTER,DATEADD(DAY, 1, D.DateTime)) AS CHAR(1)) AS Quarter
, DATEPART(MONTH,DATEADD(DAY, 1, D.DateTime)) AS MonthId
, DATENAME(MONTH,DATEADD(DAY, 1,D.DateTime)) AS Month
, DATEPART(DAY,DATEADD(DAY, 1, D.DateTime)) AS Day
, DATEPART(YEAR,DATEADD(DAY, 1, D.DateTime)) AS Year
, DATENAME(DW,DATEADD(DAY,1, D.DateTime)) AS DayOfWeek
, DATEPART(DAYOFYEAR,DATEADD(DAY,1, D.DateTime)) AS DayOfYear
FROM Dates AS D
WHERE D.DateTime < @EndDate
)
SELECT DateId AS DateId
, Date AS Date
, DateTime AS DateTime
, QuarterId AS QuarterId
, Quarter AS Quarter
, MonthId AS MonthId
, Month AS Month
, Day AS Day
, Year AS Year
, DayOfWeek AS DayOfWeek
, DayOfYear AS DayOfYear
, ROW_NUMBER() OVER(ORDER BY DateId)-1 AS DayCount
INTO #Dates
FROM Dates AS D
ORDER BY D.DateId
OPTION (MAXRECURSION 32767)
-- SELECT * FROM #Dates
SELECT COUNT(Day) AS CountOfDays, Month
FROM #Dates
GROUP BY Month
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.