web-dev-qa-db-ja.com

1桁の時間に先行ゼロをドロップせずに、SQLが日時から時間をキャストしました

CAST(DATEPART(hh, timestamp) AS varchar(2)) + ':00' AS Hour

これにより、タイムスタンプフィールドから時間が取得されますが、0〜9時間の場合、先行ゼロが埋め込まれないため、時間の降順で並べ替えると正しく並べ替えられません。

ここで何が問題なのかわかりません。 2文字のvarcharを指定して、先行ゼロ用の余分なスペースを確保します。うまくいけば、先頭のゼロを埋める関数にフィールドを渡さずにこれを修正する方法があります。

8
TWood
_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()関数で簡単に実行できます。

19
Aaron Bertrand

タイムスタンプがテーブルの列であると想定

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
4
t-clausen.dk

デフォルトで24時間のTIMEタイプを使用できます。

cast(cast(timestamp as time) AS varchar(2)) + ':00' AS Hour
3
Alex K.