2015-05-13 49 views
1

我的桌子上有2列,包含時間進出。我需要減去它們並獲得花費的時間甚至將它們轉換爲時間或任何其他方式。如何將int轉換爲時間(例如「1930」到「19:30」),並以小時和分鐘(HH:MM)開始和結束時間之間的差異?

CREATE TABLE [dbo].[FELData](
    [RCIN1] [numeric](4, 0) NOT NULL, 
    [RCOUT1] [numeric](4, 0) NOT NULL 
) ON [PRIMARY] 

RCIN1  RCOUT1  Desire Result 
150   1930  17:40 
615   1747  11:32 
410   1830  14:20 
400   1600  12:00 

這裏是我迄今所做但沒有返回正確的數字

SELECT rcin1, rcout1, DATEDIFF(mi, 
    CAST(STUFF(RIGHT('0'+CAST(rcin1 AS VARCHAR(8)),4),3,0,':') AS DATETIME), 
    CAST(STUFF(RIGHT('0'+CAST(rcout1 AS VARCHAR(8)),4),3,0,':') AS DATETIME) 
    )/60.0 AS [Hours] 
FROM FELData; 

RCIN1  RCOUT1  Returning 
150   1930  17.66 
615   1747  11.53 
410   1830  13.25 
400   1600  12.83 

我該如何解決這個問題?

更新

有時可能有用戶數據輸入像

RCIN1  RCOUT1  Returning 
49   1930  Should return 0 

感謝

回答

3

但這幾乎你想要什麼,但它無法辨別出49,1930 數據。你怎麼知道的?

由於您擁有的數據是數字,因此無需將其轉換爲散文,將其拆分,解析,轉換,重新組合,...。只要做數學!

[更新的代碼]

-- Sample data. 
declare @Samples as Table (RCIn1 Numeric(4,0), RCOut1 Numeric(4,0)); 
insert into @Samples (RCIn1, RCOut1) values 
    (150, 1930), (615, 1747), (410, 1830), (400, 1600), 
    (49, 1930); -- This is allegedly "bad" data, but no explanation is given. 
select * from @Samples; 

with 
    -- Numeric values converted to instances of TIME datatype. 
    Times as (
    select RCIn1, RCOut1, 
     Cast(DateAdd(minute, Floor(RCIn1/100) * 60 + RCIn1 % 100, 0) as Time) as RCIn1Time, 
     Cast(DateAdd(minute, Floor(RCOut1/100) * 60 + RCOut1 % 100, 0) as Time) as RCOut1Time 
    from @Samples) 
    -- Calculate delta times. 
    select *, Cast(DateAdd(minute, DateDiff(minute, RCIn1Time, RCOut1Time), 0) as Time) as DeltaTime 
    from Times 
0

你的第一個問題就是存儲時間爲一個數字, 但這裏的錯誤是我將如何轉換一個數字變成時間數據類型:

declare @timeNumb int = 1500 

    select 
     convert(time , (
reverse(substring(reverse(convert(varchar, @timeNumb)) , 3, 2)) + ':' + 
reverse(substring(reverse(convert(varchar, @timeNumb)) , 1, 2)) 
         ) 
       ) 

之後使用datediff()應該給你你正在尋找的區間長度。

+0

權,使用權( '0000' +轉換(VARCHAR,@timeNumb),4)將是我如何確保該值是4個字符長。至於處理不良數據 - 在計算之前使用案例聲明或執行清理通行證。 – Rawheiser

+0

您可以發佈完整的代碼@Rawheiser – cojimarmiami

+2

沒有必要 - 一個完整的解決方案使用HABO的上面的帖子。我也不確定爲什麼49是「壞」數據 - 因爲00:49是有效時間(午夜過後49分鐘)。 – Rawheiser

0

試試這個

-- temp table for data sample 
DECLARE @FELData AS TABLE 
    (
     [RCIN1] NUMERIC(4, 0) , 
     [RCOUT1] NUMERIC(4, 0) 
    ) 
INSERT INTO @FELData 
     (RCIN1, RCOUT1) 
VALUES (150, 1930), 
     (615, 1747), 
     (410, 1830), 
     (400, 1600) 

--Solution 
SELECT T.[RCIN1] , 
     T.[RCOUT1] , 
     RIGHT('0' + CONVERT(VARCHAR(2), T.M/60), 2) + ':' 
     + RIGHT('00' + CONVERT(VARCHAR(2), T.M % 60), 2) AS Duration 
FROM (SELECT FD.* , 
        DATEDIFF(MINUTE, 
          CONVERT(TIME, STUFF(RIGHT('0' 
                 + CONVERT(VARCHAR(8), FD.[RCIN1]), 
                 4), 3, 0, ':')), 
          CONVERT(TIME, STUFF(RIGHT('0' 
                 + CONVERT(VARCHAR(8), FD.[RCOUT1]), 
                 4), 3, 0, ':'))) AS M 
      FROM  @FELData AS FD 
     ) T 

輸出結果

enter image description here

+0

謝謝你們,我非常感謝你們的幫助 – cojimarmiami

相關問題