3

Microsoft SQL Server テーブルにdateとという 2 つの列があります。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

ブッシュの周りを打ち負かさないでください: このスキーマをできるだけ早く修正する必要があります。

その間、これは正しい値を返します。

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 に答える
1

日付、日時、またはタイムスタンプを varchar として保存しないでください。たとえば、MySQL にはこれら 3 つのタイプすべてのネイティブ タイプがあり、無効なデータが含まれていないことが保証され、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))

于 2013-03-17T23:30:19.000 に答える