2014-12-01 86 views
2

我有一個數據庫,其中時間存儲爲NVARCHAR(14)。我查詢特定用戶時間時看到的一個示例是00:08:45.68。使用SQL Server 2008 R2將HH:MM:SS.MS轉換爲秒

我想要做的是將這個0小時8分45秒和68毫秒的值轉換爲526秒的值。向上舍入大於或等於50毫秒。

我也存儲了沒有捕獲毫秒的值,例如, 98:40:12。有許多記錄有超過24小時的時間存儲,無論是毫秒(97:18:59.32)還是沒有(98:40:12)。

我看到很多查詢將秒轉換爲HH:MM:SS.MS,但沒有其他方式。我還看到很多包含日期的查詢,但我沒有隨時間存儲日期。

希望我很清楚。

我試過如下:

(DATEPART(hh, trntime.time1) * 60 * 60) + (DATEPART(MI, trntime.time1) * 60) + DATEPART(s, trntime.time1) AS 'Calc_time1_Secs' 

,但我得到了以下錯誤消息:

Msg 241, Level 16, State 1, Line 4 
Conversion failed when converting date and/or time from character string. 

回答

3

任何小時值> 24是不與TIME型真正可用。由於所有,但第一場是固定的長度,你可以:

;with T(f) as (select '97:18:59.32') 

select 
    (LEFT(f, CHARINDEX(':', f) - 1) * 60 * 60) 
    + (SUBSTRING(f, CHARINDEX(':', f) + 1, 2) * 60) 
    + SUBSTRING(f, CHARINDEX(':', f) + 4, 2) 
    + CASE WHEN (SUBSTRING(f, CHARINDEX(':', f) + 7, LEN(f)) >= 50) 
      THEN 1 ELSE 0 END 
from T 

或者

select 
    (LEFT(f, CHARINDEX(':', f) - 1) * 60 * 60) 
    + CAST(ROUND(DATEDIFF(MILLISECOND, 0, '00' 
    + (SUBSTRING(f, CHARINDEX(':', f), LEN(f))))/1000.0, 0) AS INT) 
from T 
+0

我用你的第二選擇,它似乎正在完美運作。我現在只需要時間做一次詳細的調節。我非常感謝你花時間幫助我。另外,我會盡快嘗試第一個查詢。我也是 – Tony 2014-12-01 20:19:38

0

SQL Fiddle

MS SQL Server 2008的架構設置

CREATE TABLE trntime 
    ([time1] NVARCHAR(14)) 
; 

INSERT INTO trntime 
    ([time1]) 
VALUES 
    ('00:08:45.68'), 
    ('97:18:59.32'), 
    ('97:18:59.52'), 
    ('98:40:12') 
; 

查詢1

SELECT (hour*60*60) + 
     (DATEPART(MI, minutes) * 60) + 
     DATEPART(S, minutes) + 
     ROUND(DATEPART(MS, minutes)/1000.0,0) AS 'Calc_time1_Secs' 
FROM (SELECT LEFT(time1,2) AS 'hour', 
     '00' + RIGHT(time1,LEN(time1)-2) AS 'minutes' 
     FROM trntime) AS Table1 

Results

| CALC_TIME1_SECS | 
|-----------------| 
|    526 | 
|   350339 | 
|   350340 | 
|   355212 | 

查詢2

SELECT (LEFT(time1,2)*60*60) + 
     ROUND(DATEDIFF(MS, 0, '00' + RIGHT(time1,LEN(time1)-2))/1000.0,0) 
     AS 'Calc_time1_Secs' 
FROM trntime 

Results

| CALC_TIME1_SECS | 
|-----------------| 
|    526 | 
|   350339 | 
|   350340 | 
|   355212 | 
+0

謝謝!一旦我做好和解,我會嘗試這兩種方法。 – Tony 2014-12-01 20:20:12

0

首先,通過添加0毫秒正常化的時候,如果他們缺席,然後用句號代替冒號和使用parsename(),因爲這將始終正好具有4個部分:

declare @t table (
    Id int identity(1,1) primary key, 
    TimeSec nvarchar(14) not null 
); 

insert into @t (TimeSec) 
values 
    ('00:08:45'), 
    ('14:18:59.79'), 
    ('97:18:59.22'), 
    ('98:40:12'); 


select sq.Id, sq.TimeSec, sq.PreparedTime, 
    cast(parsename(sq.PreparedTime, 4) as bigint) * 3600 
    + cast(parsename(sq.PreparedTime, 3) as bigint) * 60 
    + cast(parsename(sq.PreparedTime, 2) as bigint) 
    + case 
     when cast(parsename(sq.PreparedTime, 1) as bigint) >= 50 
      then 1 
     else 0 
     end 
as [TotalSec] 
from (
    select t.*, 
      replace(
         t.TimeSec + 
         case 
          when charindex(N'.', t.TimeSec) = 0 
           then '.0' 
          else '' 
         end, 
         ':', 
         '.' 
        ) as [PreparedTime] 
    from @t t 
) sq; 
相關問題