【问题标题】:SQL Server GROUP BY datetime ignore hour minute and a select with a date and sum valueSQL Server GROUP BY datetime 忽略小时分钟和带有日期和总和值的选择
【发布时间】:2011-11-17 00:53:15
【问题描述】:

我有一个包含两个字段的表格 - datetimeint。我只想在忽略小时和分钟的日期对datetime 进行分组。 SELECT 语句应该返回一个日期,该日期映射到一天的 int 总和。

【问题讨论】:

  • 接受其中一个答案会很好(只有提问者可以这样做

标签: sql-server datetime select group-by


【解决方案1】:
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)

【讨论】:

  • 这仅适用于 SQL Server 2008+(当引入了 Date 数据类型时)。如果您在 2005 年或更早,将演员表更改为 convert(convert(int, Datetimefield), datetime) 应该可以工作。
  • 我收到一条错误消息,提示“类型日期不是定义的系统类型”。
  • @Steven - 然后看看 Derek 的评论。这就是为什么在问题中包含您的 VERSION 是个好主意。
  • @Derek 这似乎不起作用。 select convert(convert(int, getdate()), datetime) 因语法错误而失败
  • 抱歉,convert(datetime, convert(int, getdate()))
【解决方案2】:

由于他没有具体说明他使用的是哪个版本的 SQL 服务器(date 类型在 2005 年不可用),所以也可以使用

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)

【讨论】:

  • 在 2000/2005 等旧版本中,为此需要的 varchar 转换比使用 DATEADD(dd, DATEDIFF(dd, 0, date_field),0)
【解决方案3】:

我来研究我必须这样做的选项,但是,我相信我使用的方法是最简单的:

SELECT COUNT(*), 
       DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC;

【讨论】:

  • 这将适用于任何版本的 SQL Server,并且比使用 varchar 转换更快。
  • 你能澄清一下什么是“dd”吗?我不明白你应该在里面放什么。
  • "dd" 是日期部分,相当于天。您也可以使用“day”、“d”或“dd”
【解决方案4】:

-- 我喜欢这个作为数据类型,格式与日期时间数据类型保持一致

;with cte as(
    select 
        cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15'
    group by
        cast(utcdate as date), DATEPART(hour, utcdate)
)
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts
from cte

【讨论】:

    【解决方案5】:

    我个人更喜欢格式功能,让你可以很容易地简单地更改日期部分。

         declare @format varchar(100) = 'yyyy/MM/dd'
         select 
            format(the_date,@format), 
            sum(myfield) 
         from mytable 
         group by format(the_date,@format) 
         order by format(the_date,@format) desc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多