【问题标题】:T-SQL code to get a DateTime contain only Month and Year from any DateTime获取 DateTime 的 T-SQL 代码仅包含来自任何 DateTime 的月份和年份
【发布时间】:2009-10-01 15:31:56
【问题描述】:

给定一个表 Event 包含一个名为 EventTime 的 DateTime 类型的字段,并且该值将包含日期和时间元素,我需要创建一个汇总查询来计算每个月的事件数。

分组依据字段的结果类型也必须是日期时间,时间元素为 0,并设置为该月的第一天。

这是我目前所拥有的,但它不是很优雅,我不确定它是否特别有效。

  SELECT COUNT(1) AS [CountOfEvents],
         DATEADD(d, 1 - DAY(EventTime), DATEADD(dd, 0, DATEDIFF(dd, 0, EventTime))) AS [Month]
    FROM [Event]
GROUP BY DATEADD(d, 1 - DAY(EventTime), DATEADD(dd, 0, DATEDIFF(dd, 0, EventTime)))

更高效或更优雅的更好建议?

【问题讨论】:

    标签: sql sql-server tsql datetime


    【解决方案1】:

    这个楼层到本月:

    select dateadd(month,datediff(m,0,GETDATE()),0);
    

    输出:

    -----------------------
    2009-10-01 00:00:00.000
    
    (1 row(s) affected)
    

    所以试试这个:

    SELECT
       COUNT(*) as CountOF
        ,dateadd(month,datediff(m,0,EventTime),0)
        FROM [Event]
        GROUP BY dateadd(month,datediff(m,0,EventTime),0)
        ORDER BY 2
    

    【讨论】:

    • 关键是按您感兴趣的单位(在本例中为月份)进行楼层,请参阅此链接:stackoverflow.com/questions/85373/floor-a-date-in-sql-server/…
    • ORDER BY 2 的目的是什么?
    • 它将按第二列对查询进行排序。当我在我的系统上运行这个查询时,很难检查结果,所以我对它们进行了排序。当我把它粘贴在这里时,我只是把它留在那里。如果不需要,请删除。
    【解决方案2】:
    SELECT
        COUNT(1) AS [CountOfEvents],
        DATEADD(month, DATEDIFF(month, 0, [EventTime]), 0) AS [Month]
    FROM [Event]
    GROUP BY DATEADD(month, DATEDIFF(month, 0, [EventTime]), 0)
    

    【讨论】:

      【解决方案3】:

      您可以使用MONTH(GetDate()) T-SQL 函数。

      您还只是想从日期时间中剥离时间吗?

      如果是这样,试试这个:

      DATEADD(d, DATEDIFF(d, 0, GetDate()), 0) 
      

      它更简洁,更具可读性。

      【讨论】:

      • 谢谢我去掉时间,这是我表达中的一个元素(仔细看你可以看到它)但是我不想去掉年份我只想把一天设置为第一天.所以 MONTH 函数并不是那么有用。
      【解决方案4】:

      也许这更“可读”:

      SELECT
       COUNT(1) AS [CountOfEvents],
       CONVERT(datetime, CONVERT(varchar, EventTime, 112)) + 1 - DAY(EventTime) AS [Month]
      FROM [Event]
      GROUP BY CONVERT(datetime, CONVERT(varchar, EventTime, 112)) + 1 - DAY(EventTime)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        • 2016-04-10
        相关资源
        最近更新 更多