从存储为字符串的时间戳开始的SQL平均时间
在Microsoft SQL Server表中,我有两列名为从存储为字符串的时间戳开始的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())
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]