mysql - 如何计算两个日期之间的天数,

标签 mysql sql date datediff

在 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/

相关文章:

mysql - 在 MySQL 表中查找 "exotic"值

c - 如何在 ANSI C 中获取 X 之前的天数和小时数

mysql - 将自定义外键分配给 Rails Junction 表

MySQL 查询错误计数

MySQL 使用 group by 对多列进行计数

sql - 计算ssis中两个日期之间的时差

javascript - 如果单击“确定”更新数据库中的 2 行,则会发出警报,否则不执行任何操作

SQL: ID x 在日期 y 的状态是什么(有没有更有效的方法?)

c# - 计算给定日期范围内星期一的数量

MySQL LEFT Join 具有多种可能性和 Inner Join