从存储为字符串的时间戳开始的SQL平均时间

从存储为字符串的时间戳开始的SQL平均时间,sql,sql-server,casting,group-by,average,Sql,Sql Server,Casting,Group By,Average,在Microsoft SQL Server表中,我有两列名为date和starthour 两列都是char;另一个人成功了,我不知道为什么它是这样建造的 我想确定每个日期的平均开始时间 date starthour 20/01/2011 8:25:00 21/01/2011 8:20:00 我尝试了以下方法: SELECT date, Avg(cast(starhour as datetime())

在Microsoft SQL Server表中,我有两列名为
date
starthour

两列都是char;另一个人成功了,我不知道为什么它是这样建造的

我想确定每个日期的平均开始时间

date                     starthour
20/01/2011               8:25:00
21/01/2011               8:20:00
我尝试了以下方法:

SELECT date, Avg(cast(starhour as datetime())) AS starhour
FROM table
GROUP BY date

但它不起作用。

不要将日期、日期时间或时间戳存储为varchar。例如,MySQL为这三种类型都提供了本机类型,这保证了它们中不会包含无效数据,并且MySQL将知道如何处理它们:

您应该做的是有一个字段,
date
,它是
timestamp
类型,包含日期和时间。您应该重构数据库,并通过强制转换将所有数据转换为新格式,这样您就再也不用担心了

之后,您需要做的事情会根据您的SQL风格而有所不同。例如,这个答案适用于MySQL,但每种风格都有不同的datetime函数(不幸的是!)

MySQL的日期时间函数是

未经测试,但类似于:

按摘录分组(从日期算起)


AVG(提取(从日期算起的小时)*60+提取(从日期算起的分钟))
我们不要拐弯抹角了:您应该尽快修复此模式

同时,这将返回正确的值

select [date], 
 CONVERT(VARCHAR(8), 
 cast((avg(cast(cast(starhour as datetime)  as float)))   as datetime) , 108)
  from table
group by [date]

演示

此问题的答案可能取决于您使用的数据库引擎。你能更新你的问题提到这一点吗?另外,您的starthour列似乎是时间而不是日期时间,因为它不包含日期组件。我使用的是SQL server,实际上starthour只是一个字符。
select [date], 
 CONVERT(VARCHAR(8), 
 cast((avg(cast(cast(starhour as datetime)  as float)))   as datetime) , 108)
  from table
group by [date]
SELECT [date], 
  CAST(DATEADD(second, AVG(DATEDIFF(second, 0 , starhour)), '00:00:00') AS time)
FROM dbo.test17
GROUP BY [date]