2012-04-27 102 views
1

的日期/時間,我有一個日期時間字段在SQL Server中有這樣的價值2005表:格式化SQL Server 2005中

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

的分,秒,和毫秒始終爲零。

我需要顯示這樣的「時間段」(基本上,時間加一小時):我需要用這個

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。

有沒有清潔的方式做到這一點?

回答

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)增加1小時當前datetime

你可以測試它不與表:

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); 
+0

謝謝...您的解決方案几乎讓我有,但更重要的是確認沒有真正優雅的方式來做到這一點。 – aphoria 2012-04-27 19:57:56

+0

通常你只是通過日期,然後它是你的客戶端/服務器端處理它,讓你更好地控制輸出,並有一個功能或過程,可以在你的應用程序的其他領域重用... – balexandre 2012-04-28 07:09:44

+0

我同意。我應該澄清,在SQL中沒有一種真正優雅的方式來實現這一點。 – aphoria 2012-04-28 14:29:06

1

的在SQL Server中構建日期/時間格式將只格式化爲實際日期格式,因此無論如何您都可以使用自定義格式。如果您使用這種方式提供SSRS,那麼您可以使用表達式在SSRS中對其進行格式化。否則,您可以使用類似於您所描述的技術的查詢格式化查詢。

如果你實際上是用VB應用程序顯示它,那麼你可以做客戶端。

如果您的日期/時間值始終在小時或某種一致的間隔也可以使鍵上的時間與存儲爲VARCHAR列格式化的間隔參照表並使用它。這將節省您將格式化表達式插入到生成區間描述所需的每個查詢中。

0

FollowingConcernedOfTunbridgeW的建議是,如果您維護一個兩列表,其中主鍵int column [hr]從0到23,char(20)列[rng]包含每個小時的以空格爲前綴的範圍字符串

' 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; 
+0

感謝您的建議。我將在星期一進行實驗。 – aphoria 2012-04-28 02:25:08