CAST(DATEPART(hh, timestamp) AS varchar(2)) + ':00' AS Hour
これにより、タイムスタンプフィールドから時間が取得されますが、0〜9時間の場合、先行ゼロが埋め込まれないため、時間の降順で並べ替えると正しく並べ替えられません。
ここで何が問題なのかわかりません。 2文字のvarcharを指定して、先行ゼロ用の余分なスペースを確保します。うまくいけば、先頭のゼロを埋める関数にフィールドを渡さずにこれを修正する方法があります。
_SELECT RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE())), 2) + ':00';
_
0で埋めたくないですか? OK、パディングの混乱なしに同様に醜い方法でそれを行うことができます:
_SELECT LEFT(CONVERT(TIME(0), GETDATE()), 2) + ':00';
_
明らかに、GETDATE()
を列名に置き換えてください。これは予約語であるため、実際にはtimestamp
ではないことを願っています。悲しいことに、日付や時刻とは関係のないデータ型です。
これらのソリューションのいずれかが気に入らない場合は、SQL Serverからデータを選択し、クライアントアプリケーションにフォーマット/プレゼンテーションの詳細を処理させます。確かに、これは、たとえばC#のformat()
関数で簡単に実行できます。
タイムスタンプがテーブルの列であると想定
select convert(char(3), timestamp, 108) + '00' AS Hour
from yourtable
代替案
select left(cast(dateadd(hh, datediff(hh, 0, timestamp), 0) as time), 5)
from yourtable
編集:
少しテストした後、これが最速の方法であるという結論に達しました(アーロンのソリューションとしてのパフォーマンスと構文のほとんど)
SELECT RIGHT(100 + DATEPART(HOUR, timestamp) , 2) + ':00'
from yourtable
デフォルトで24時間のTIMEタイプを使用できます。
cast(cast(timestamp as time) AS varchar(2)) + ':00' AS Hour