在 MySQL 中是否可以轻松获取两个日期之间的天数,按月分组,然后将这些天数分散在月份之间,这样当我按月分组时,我可以看到两个日期之间有多少天每个月有两个日期。
示例:创建 05.05.2014 到到期 06.06.2014 返回 32 天。我想将其显示为:
5 月:26 天 六月:5天
到目前为止我有:
SELECT MONTHNAME(date) as month_name,
SUM(DATEDIFF(expiration, date)) AS num_days
FROM reservations
GROUP BY month_name
但它并没有按月正确地分散日期,很明显,只是将它们全部放入 group-by-start-date-month 中。任何想法都会受到高度评价。
最佳答案
我会先构建一个全面的日期临时表(或 CTE)。
从那里您可以选择您喜欢的内容,然后根据您的需要对其进行分组。
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
关于mysql - 如何计算两个日期之间的天数,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24624912/