2009-09-27 5 views
1

Utilisation de SQL Server 2000:Conversion chaîne à problème 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 

colonne T_cardevent.cardeventtime type_données Varchar.

Dans le tableau des valeurs de Cardeventtime sont 080002, 091235 .... ainsi de suite ...,

Quand j'exécution de la requête au-dessus montrant erreur arithmétique express débordement pour convertir l'expression de type de données Datetime.

Répondre

2

Donc, ce "080002" signifie? 8 heures, 0 minutes, 2 secondes?

Ce n'est certainement pas un format DATETIME valide dès sa sortie de l'emballage - et il n'est pas non plus conforme à l'un des SQL Server CONVERT styles valides.

Vous devrez donc effectuer quelques conversions manuellement. Y at-il une chance que vous puissiez envelopper la table avec cette colonne dans une vue qui pourrait gérer la conversion?

Il faudrait faire quelque chose le long des lignes de:

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

et cela devrait transformer votre « 080002 » dans « 08:00:02 » qui peut ensuite être converti en un DATETIME (pas séparé type de données de temps jusqu'à SQL Server 2008) en utilisant le numéro de style. 8 (hh: mm: ss).

Marc

+0

@marc_s. Mais la date affiche aussi comme 01/01/1900 08:00:02. Je n'ai besoin que de l'heure – Gopal

+1

Ensuite, utilisez Convert (DATETIME, , 101). Pour plus d'informations sur la conversion, voir: http://msdn.microsoft.com/en-us/library/ms174420.aspx – tster

+0

@Gopal: dans SQL Server 2000, vous avez uniquement DATETIME qui contient à la fois DATE et TIME. Seul SQL Server 2008 a un type de données TIME spécifique qui est uniquement TIME. –

0

J'ai fait une série d'hypothèses ici, et travaillé sans être en mesure de le tester, mais voici une solution:

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 

Je n'ai pas utilisé trucs très fréquemment, les points d'insertion peuvent être désactivés.

Questions connexes