2012-10-09 7 views
0

Nous avons foiré du côté de l'application et chargé des données incorrectes dans une colonne. Maintenant, nous devons corriger ces données .. Voici ce que nous devons faire.correctif de données temporelles

Starttime      Answertime 

2012-08-30 00:40:40.000  2012-08-30 03:40:53.000 

Le temps de réponse est presque 3 heures de plus que le démarrage, ce qui est incorrect. Maintenant, ce dont nous avons besoin est de trouver la différence de secondes entre le temps de réponse et startime et l'ajouter au début. Donc pour ci-dessus 2012-08-30 00: 40: 53.000 sera nouvelle réponse temps.

Sorte de confus en ce moment sur la façon de le faire. Utilisation d'un serveur SQL Server 2008 R2

+0

Est-ce que «Answertime» est toujours éteint exactement pendant 3 heures? Si oui, c'est une solution simple. Si vous passez par secondes seulement, que se passe-t-il lorsque la minute est différente pour chaque valeur? – RedFilter

+0

ouais .. c'est la question .. heure diff n'est pas toujours 3 heures et doit prendre en compte minutes diff aussi. – user1679411

+0

Si vous devez comptabiliser les minutes, vous devez également tenir compte de la différence d'heure. Et jour, mois, année :) Par exemple, 'Starttime = '2012-12-31 11: 59: 59'' – RedFilter

Répondre

0
declare @t table (
    Starttime datetime, 
    Answertime datetime); 
insert @t values (
    '2012-08-30 00:40:40.000','2012-08-30 03:40:53.000'),(
    '2012-08-30 00:59:59.900','2012-08-30 03:00:03.000'); 

update @t set Answertime = 
    case when dateadd(hh,datediff(hh,answertime,starttime),answertime) > starttime 
     then dateadd(hh,datediff(hh,answertime,starttime),answertime) 
     else dateadd(hh,datediff(hh,answertime,starttime)+1,answertime) end 
where Answertime > DateAdd(hh,1,StartTime); -- more than 1 hour apart 

select * from @T; 

>> 
STARTTIME     ANSWERTIME 
August, 30 2012 00:40:40 August, 30 2012 00:40:53 
August, 30 2012 00:59:59 August, 30 2012 01:00:03 

L'essentiel de la réponse est que laissant minutes: Seconds.MilliSecs de côté, le answertime est mis dans la même heure que l'heure de début. Il corrige également les cas de bords comme la 2ème ligne où le changement le fait plus tôt que le début.

0

En supposant que vous voulez ignorer tout sauf les secondes, mais gérer le cas où la différence dépasse une minute.

Update timetable set Answertime = 
case when DatePart(ss,Answertime) >= DatePart(ss,Starttime) 
    then dateAdd(ss, DatePart(ss,Answertime)-DatePart(ss,starttime),Starttime) 
else 
    dateAdd(ss, 60+DatePart(ss,Answertime)-DatePart(ss,Starttime),Starttime) 
end 
+0

Merci à tous .. Au-dessus du script a travaillé. – user1679411

Questions connexes