2011-09-11 5 views
2

J'ai un serveur MS SQL 2005. J'ai une base de données par le nom STAT & 2 colonnes par nom STARTRUN & ENDRUN et avoir beaucoup de lignes dedans.Récupérer une requête de durée

STARTRUN  ENDRUN 
20110910200007 20110910200017 
20110910200028 20110910200037 
20110910200048 20110910200057 

Il montre l'heure de début et de fin d'une activité et est en YYYYMMDDHHMMSS. Le type de données pour cette colonne est VARCHAR. J'essaie d'écrire un script SQL où je peux récupérer la durée de chaque activité et le vider dans un fichier csv comme indiqué ci-dessous.

START DATE START TIME  END DATE END TIME DURATION 
10-09-2011 8:00:07 PM  11-09-2011 1:10:10 AM  5:10:03 

Aidez-moi s'il vous plaît.

+0

Qu'avez-vous essayé? Qu'est-ce qui n'a pas fonctionné? Où exactement avez-vous des difficultés? – Oded

+1

En ignorant le fait que cela devrait être datetime, pourquoi utiliser ensuite varchar pour les données de caractères de longueur fixe? – gbn

+0

Approuvé gbn. Datetime ou au moins bigint (8 octets de toute façon). Datetime rendrait la solution beaucoup moins compliquée. – brian

Répondre

1

D'abord vous devriez trouver un moyen de convertir votre format en datetime. La sous-requête ci-dessous fait cela en le faisant ressembler à une date canonique ODBC, puis en appelant convert. Ensuite, vous pouvez combiner plus convert avec datediff pour obtenir votre format de sortie désiré.

select convert(varchar, startrun, 105) + ' ' + 
     substring(convert(varchar, startrun, 109), 13, 8) + ' ' + 
     substring(convert(varchar, startrun, 109), 25, 2) 
,  convert(varchar, endrun, 105) + ' ' + 
     substring(convert(varchar, endrun, 109), 13, 8) + ' ' + 
     substring(convert(varchar, endrun, 109), 25, 2) 
,  substring('0' + cast(datediff(hh, startrun, endrun) 
      as varchar), 1, 2) + ':' + 
     substring('0' + cast(datediff(mi, startrun, endrun) % 60 
      as varchar), 1, 2) + ':' + 
     substring('0' + cast(datediff(s, startrun, endrun) % 60*60 
      as varchar), 1, 2) 
from (
     select convert(datetime, 
       substring(startrun,1,4) + '-' + 
       substring(startrun,5,2) + '-' + 
       substring(startrun,7,2) + ' ' + 
       substring(startrun,9,2) + ':' + 
       substring(startrun,11,2) + ':' + 
       substring(startrun,13,2), 
       120) as startrun 
     ,  convert(datetime, 
       substring(endrun,1,4) + '-' + 
       substring(endrun,5,2) + '-' + 
       substring(endrun,7,2) + ' ' + 
       substring(endrun,9,2) + ':' + 
       substring(endrun,11,2) + ':' + 
       substring(endrun,13,2), 
       120) as endrun 
     from @YourTable 
     ) as SubQueryAlias 

est ici un working example at SE Data. Voir this question pour exporter le résultat d'une requête dans un fichier CSV.

Questions connexes