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

时间:2013-03-17 23:24:13

标签: sql sql-server casting group-by average

我在Microsoft SQL Server表中有两列名为datestarthour

两列都是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

但它不起作用。

3 个答案:

答案 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上的演示