2009-05-22 249 views
5

是否有一種乾淨而簡單的方法來格式化整數,即將整數分鐘數轉換爲小時和分鐘的十進制表示形式。很遺憾,在T-SQL中沒有像Timespan這樣的東西來支持這一點。在T-SQL中將分鐘轉換爲小時和分鐘

只是爲了清楚我的意思是說,如果我有70分鐘,我想把它轉換成1小時10分鐘的表示,即1.10。我也想保留它作爲一個varchar或一些東西,以確保尾隨零保持在適當的位置。

無論如何,這可以創建爲SQL中的自定義函數,以便它可以從不同的查詢中重用?

回答

17

要獲得個小時,要通過60來劃分要獲得剩下的幾分鐘,你想要麼拿總分鐘數模60或出現的總分鐘和小時時間60之間的差異使剩餘部分小數位,鴻溝100.0權:那你將失去尾隨零恕我直言存儲的持續時間這樣

SELECT minutes/60 + (minutes % 60)/100.0 ... 

注是一個糟糕的主意,因爲一)你不能做任何更多的數學與它和b)稍後他們看這個代碼時會有人感到困惑。

你好得多使用字符串表示類似如下(我建議使用「:」「」而不是再次,以表示這不是一個數字):

SELECT CAST((minutes/60) AS VARCHAR(8)) + ':' + 
     RIGHT('0' + CAST((minutes % 60) AS VARCHAR(2)), 2) ... 

就創建自定義函數而言,您可以創建一個存儲過程,然後從其他代碼調用它。請注意,必須在每個數據庫中創建存儲過程。

不知道使存儲過程是值得的,雖然,除非你想成爲票友,並返回一個時間跨度樣行。

+1

請記住,如果您要分割一個整數並希望返回小數,則應該將結果放入適當的數據類型中。 – TheTXI 2009-05-22 16:14:45

+0

@TheTXI好點 – 2009-05-22 16:27:10

1
select 70/60 + (70 % 60)/100.0 
0

我花了一段時間試圖做同樣的事情,繼承人如何我做到了:

convert(varchar, cast((RouteMileage/@average_speed) as integer))+ ':' + convert(varchar, cast((((RouteMileage/@average_speed) - cast((RouteMileage/@average_speed) as integer)) * 60) as integer)) As TravelTime, 

dateadd(n, -60 * CAST((RouteMileage/@average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime 

OUTPUT:

DeliveryDate    TravelTime    DepartureTime 
2012-06-02 12:00:00.000  25:49   2012-06-01 10:11:00.000 
0
CAST(Duration/60 + (duration % 60) /100.0 as Decimal(10,1)) 
-1

在SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm') 
相關問題