我在Microsoft SQL Server表中有两列名为date
和starthour
。
两列都是char;另一个人做到了,我不知道为什么它是以这种方式建造的。 :)
date starthour
20/01/2011 8:10:00
20/01/2011 8:20:00
20/01/2011 8:30:00
20/01/2011 8:40:00
21/01/2011 8:10:00
21/01/2011 8:20:00
21/01/2011 8:30:00
我想确定每个日期的平均starthour
。
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
但它不起作用。
答案 0 :(得分:1)
不要将日期,日期时间或时间戳存储为varchar。例如,MySQL具有所有这三种类型的本机类型,这可以保证您不会在其中包含无效数据,并且MySQL将知道如何对待它们:http://dev.mysql.com/doc/refman/5.1/en/datetime.html
您应该做的是拥有一个date
字段,timestamp
类型,包含日期和时间。您应该重构数据库并通过投射将所有数据转移到新格式,这样您就不必再担心了。
之后你需要做什么根据你的SQL风格而有所不同。例如,这个答案将针对MySQL,但每种风格都有不同的日期时间函数(不幸的是!)。
MySQL的日期时间函数为http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
未经测试,但类似:
GROUP BY EXTRACT(day from date)
AVG(EXTRACT(hour from date)*60 + EXTRACT(minute from date))
答案 1 :(得分:1)
让我们不要围绕灌木丛:你应该尽快修复这个模式。
在此期间,这将返回正确的值。
select [date],
CONVERT(VARCHAR(8),
cast((avg(cast(cast(starhour as datetime) as float))) as datetime) , 108)
from table
group by [date]
答案 2 :(得分:1)
SELECT [date],
CAST(DATEADD(second, AVG(DATEDIFF(second, 0 , starhour)), '00:00:00') AS time)
FROM dbo.test17
GROUP BY [date]
SQLFiddle上的演示