【问题标题】:DateTime group by hour in SQLSQL中按小时分组的日期时间
【发布时间】:2020-10-26 14:03:27
【问题描述】:

我想按小时分组,并在选择列“时间”中显示全时格式(例如:12:15:56 PM) 但是当我运行时可能会显示以下错误代码。

错误:选择列表中的列“vFlowRate_hr.Time”无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

select Sum(Value) As FlowRateSum, Dir.PlantAddress, PlantType, FlowRateNo,vFlowRate_hr.Date , time 
from vFlowRate_hr Inner Join DIR ON vFlowRate_hr.FlowRateID = DIR.ID
where FlowRateID = @FlowRateID and DIR.PlantType = @PlantType
and vFlowRate_hr.Date BETWEEN @FromDate AND @ToDate
group by FlowRateNo,Dir.PlantAddress,PlantType,vFlowRate_hr.Date, DATEPART(Hour, time)

【问题讨论】:

  • 错误信息的哪一部分你不明白?看起来很清楚。
  • 您在GROUP BY 子句中有DATEPART(Hour, time),但在SELECT 列表中只有time... SQL Server 希望它保持一致;-)
  • 由于您是按 datepart(hour,time) 分组的,因此您在选择中的时间必须是聚合时间,即 max(time) 或按 datepart(hour,time) 匹配您的组

标签: sql sql-server database datetime group-by


【解决方案1】:

大概,你想要小时:

select Sum(Value) As FlowRateSum, Dir.PlantAddress, PlantType, FlowRateNo, vFlowRate_hr.Date,
       datepart(hour, time)
 from vFlowRate_hr Inner Join
      DIR
      ON vFlowRate_hr.FlowRateID = DIR.ID
 where FlowRateID = @FlowRateID and DIR.PlantType = @PlantType and
       vFlowRate_hr.Date BETWEEN @FromDate AND @ToDate
 group by Dir.PlantAddress, PlantType, FlowRateNo, vFlowRate_hr.Date,
       datepart(hour, time)

那么select 将匹配group by

请注意,我更改了group by,因此列的顺序与select 中的顺序相同——更易于验证。

此外,您应该限定所有列引用,以便清楚它们的来源。照原样,查询仍将运行,但由于可能不明确的列引用,它的可维护性和可更新性较差。

【讨论】:

  • 我了解,但我想在报告中选择全职格式 (hh:mm:ss am) 并按小时分组。
  • Datepart 仅显示小时,但我想以这种格式显示时间“hh:mm:ss am”。请帮帮我!
  • @NabeelYousaf 。 . .那没有意义。我的意思是,如果你想要的话,你可以使用min(time)
  • 谢谢!。问题已通过您的建议得到解决。它工作正常。
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2021-03-11
  • 2017-04-14
  • 2019-01-07
  • 1970-01-01
  • 2011-01-16
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多