2009-09-27 164 views
1

使用SQL Server 2000:將字符串轉換成datetime問題

SELECT PERSONID, 
     CARDEVENTDATE, 
     INTIME, 
     CASE 
     WHEN OUTTIME = INTIME THEN 
      'No PunchOut' 
     ELSE 
      OUTTIME 
     END AS OUTTIME, 
     CONVERT(char(8), CASE 
          WHEN DateAdd(Day, - DateDiff(Day, 0, OutTime), OutTime) > '18:00:00' THEN 
          Cast('18:00:00' AS datetime) 
          ELSE 
          DateAdd(Day, - DateDiff(Day, 0, OutTime), OutTime) 
         END - CASE 
           WHEN DateAdd(Day, - DateDiff(Day, 0, InTime), InTime) < '09:00:00' THEN 
            Cast('09:00:00' AS datetime) 
           ELSE 
            DateAdd(Day, - DateDiff(Day, 0, InTime), InTime) 
           END, 8) AS WorkTime 
    FROM (SELECT T_PERSON.PERSONID, 
       T_CARDEVENT.CARDEVENTDATE, 
       MIN(T_CARDEVENT.CARDEVENTTIME) AS INTIME, 
       MAX(T_CARDEVENT.CARDEVENTTIME) AS OUTTIME 
      FROM T_PERSON 
    INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID 
     GROUP BY T_PERSON.PERSONID, T_CARDEVENT.CARDEVENTDATE) DERIVEDTBL 

T_cardevent.cardeventtime列數據類型是VARCHAR。

在表Cardeventtime值是080002,091235 ....等等...,

當我執行上述查詢它示出了用於將表達式轉換爲數據類型日期時間算術快遞溢出錯誤。

回答

2

那麼這個「080002」代表什麼? 8小時,0分鐘,2秒?

這絕對不是一個有效的DATETIME格式開箱 - 這不符合任何有效SQL Server CONVERT styles,無論是。

所以你必須自己做一些轉換,手動。是否有機會將包含此列的表放入可處理轉換的視圖中?

你不得不做的線沿線的東西:

CONVERT(DATETIME, SUBSTRING(CardEventTime, 1, 2) + ':' + 
        SUBSTRING(CardEventTime, 3, 2) + ':' + 
        SUBSTRING(CardEventTime, 5, 2), 8) 

,這應該把你的「080002」到「8時00分02秒」,那麼它可以被轉換成一個DATETIME(沒有單獨實時數據類型,直到SQL Server 2008)使用樣式號。 8(hh:mm:ss)。

馬克

+0

@marc_s。但日期也顯示爲01/01/1900 08:00:02。我只需要時間 – Gopal 2009-09-27 15:11:50

+1

然後使用轉換(DATETIME,,101)。關於轉換查看更多信息:http://msdn.microsoft.com/en-us/library/ms174420.aspx – tster 2009-09-27 15:34:09

+0

@Gopal:在SQL Server 2000中,你只有DATETIME其中包含日期和時間。只有SQL Server 2008有一個特定的TIME數據類型,只有TIME。 – 2009-09-27 17:13:13

0

我做了一系列的假設在這裏,沒有能夠測試它的工作,但這裏有一個可能的解決方案:

SELECT PERSONID, 
     CARDEVENTDATE, 
     INTIME, 
     CASE 
     WHEN OUTTIME = INTIME THEN 
      'No PunchOut' 
     ELSE 
      OUTTIME 
     END AS OUTTIME, 
    Stuff(Stuff(Right('000000' + 
     CONVERT(varchar(5), CASE 
          WHEN Convert(int,OutTime) > 180000 THEN 
          180000 
          ELSE 
          Convert(int,OutTime) 
         END - CASE 
           WHEN Convert(int,InTime) < 90000 THEN 
            90000 
           ELSE 
            Convert(int,InTime) 
           END), 6),5,0,':'),3,0,':') 
     AS WorkTime 
    FROM (SELECT T_PERSON.PERSONID, 
       T_CARDEVENT.CARDEVENTDATE, 
       MIN(T_CARDEVENT.CARDEVENTTIME) AS INTIME, 
       MAX(T_CARDEVENT.CARDEVENTTIME) AS OUTTIME 
      FROM T_PERSON 
    INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID 
     GROUP BY T_PERSON.PERSONID, T_CARDEVENT.CARDEVENTDATE) DERIVEDTBL 

我沒有用的東西很頻繁,所以插入點可能會關閉。