1

SQL Server 2005テーブルに、次のような値を持つ日時フィールドがあります。

2012-04-23 09:00:00.000
2012-04-23 14:00:00.000

分、秒、およびマイクロ秒は常にゼロです。

次のような「タイムスロット」(基本的には時間プラス1時間)を表示する必要があります。

2012/04/23  09:00 AM - 10:00 AM
2012/04/23  02:00 PM - 03:00 PM

私はこれを使って必要なものを手に入れました:

SELECT SUBSTRING(CONVERT(VARCHAR, TimeSlot, 20), 1, 10) + '  ' +
       RIGHT('00000' + LTRIM(SUBSTRING(CONVERT(VARCHAR(24), TimeSlot, 109), 13, 5)), 5) + ' ' +
       SUBSTRING(CONVERT(VARCHAR(19), TimeSlot, 100),18,2) + ' - ' +
       RIGHT('00000' + LTRIM(SUBSTRING(CONVERT(VARCHAR(24), DATEADD(hh, 1, TimeSlot), 109), 13, 5)), 5) + ' ' +
       SUBSTRING(CONVERT(VARCHAR(19), DATEADD(hh, 1, TimeSlot), 100), 18, 2) AS TimeSlot
FROM MyTable

動作しますが、とても汚れています。

コード(VB .NET)で簡単に実行できることはわかっていますが、SQLで実行する必要があると想定しています。

これを行うためのよりクリーンな方法はありますか?

4

3 に答える 3

1

SQL Serverに組み込まれている日付/時刻形式は、実際の日付形式にのみフォーマットされるため、とにかくカスタムフォーマットを使用できます。これをSSRSにフィードしている場合は、式を使用してSSRS内でフォーマットできる可能性があります。それ以外の場合は、説明している手法のようなものを使用して、クエリでフォーマットする必要があります。

実際にVBアプリで表示している場合は、クライアント側で表示できます。

日付/時刻の値が常に時間または一定の間隔である場合は、varchar列として格納されているフォーマットされた間隔を使用して、時刻をキーとする参照テーブルを作成し、それを使用することもできます。これにより、間隔の説明を作成するために必要なすべてのクエリにフォーマット式をインライン化する必要がなくなります。

于 2012-04-27T15:57:34.130 に答える
1

組み込みのconversionsを使用すると、次のようなものを使用します。

SELECT 
    convert(varchar, [TimeSlot], 111) + ' ' +
    RIGHT(convert(varchar, [TimeSlot], 0), 7) + ' - ' +
    RIGHT(convert(varchar, dateadd(hour, 1, [TimeSlot]), 0), 7)
FROM
    [MyTable];

これにより、必要な行が得られます

2012/04/23  9:00AM - 10:00AM

詳細に:

  • convert(varchar, @dt, 111)datetimeを日本語形式に変換しますyy/mm/dd
  • convert(varchar, @dt, 0)を に変換しdatetimeApr 23 2012 9:00AM、時間部分を使用できるようにします
  • dateadd(hour, 1, @dt)datetime現在の値に 1 時間を追加します

次を使用して、テーブルなしでテストできます。

DECLARE @dt DATETIME
SET @dt = '2012-04-23 09:00:00'

PRINT convert(varchar, @dt, 111) + ' ' +
      RIGHT(convert(varchar, @dt, 0), 7) + ' - ' +
      RIGHT(convert(varchar, dateadd(hour, 1, @dt), 0), 7);
于 2012-04-27T15:48:11.763 に答える
0

ConcernedOfTunbridgeW の提案に従って、0 から 23 までの主キー int 列 [hr] と、各時間のスペースでプレフィックスされた範囲文字列を含む char(20) 列 [rng] を持つ 2 列のテーブルを維持する場合

' 12:00 AM - 01:00 AM'  (in the row where hr = 0)
...

' 11:00 PM - 12:00 AM'  (in the row where hr = 23)

この単純なクエリは、あなたが望むものを生成するはずです:

  select
    convert(char(10),TimeSlot, 111) + rng as TimeRange
  from T join RangesByHr
  on datepart(hour,TimeSlot) = hr;
于 2012-04-28T01:33:25.190 に答える