2009-09-27 138 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 

我没有用的东西很频繁,所以插入点可能会关闭。