3

我在 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

但它不起作用。

4

3 回答 3

2
SELECT [date], 
  CAST(DATEADD(second, AVG(DATEDIFF(second, 0 , starhour)), '00:00:00') AS time)
FROM dbo.test17
GROUP BY [date]

SQLFiddle上的演示

于 2013-03-17T23:38:17.090 回答
1

不要将日期、日期时间或时间戳存储为 varchar。例如,MySQL 对所有这三种类型都有本机类型,这保证您不会在其中包含无效数据,并且 MySQL 将知道如何处理它们:http ://dev.mysql.com/doc/refman /5.1/en/datetime.html

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

之后,您需要做的事情会根据您的 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))

于 2013-03-17T23:30:19.000 回答
1

让我们不要拐弯抹角:您应该尽快修复此架构。

同时,这将返回正确的值。

select [date], 
 CONVERT(VARCHAR(8), 
 cast((avg(cast(cast(starhour as datetime)  as float)))   as datetime) , 108)
  from table
group by [date]
于 2013-03-17T23:36:51.780 回答