2013-03-15 2 views
1

J'ai une table de base de données dans laquelle il y a une colonne OccurDate de type DateTime.Erreur couse DataTime-varchar (10)

données est comme ça ...

06-03-2013 06:47:49 
06-03-2013 16:47:49 

Je dois trouver InTime, OutTime, WorkDuration.

J'utilise requête comme ceci

Min(convert(varchar(10),OccurDateTime,108)) AS InTime, 
Max(convert(varchar(10),OccurDateTime,108)) AS OutTime, 

mais je suis face à problème lors du calcul workDuration parce que le

workDuration = 16:30:00 - InTime //16:30:00 means 4:30 pm 

et est maintenant INTIME varchar(10) donc il ne peut pas soustraire de Datetime ..... ..

La requête que j'utilise ..

SELECT UserID AS EmpCode,FirstName,LastName,Department,convert(varchar(10),OccurDateTime,103) AS Date,Min(convert(varchar(10),OccurDateTime,108)) AS InTime, 
Max(convert(DateTime,OccurDateTime,108)) AS OutTime, 
convert(varchar(10),(Max(convert(DateTime,OccurDateTime,108))- Min(convert(DateTime,OccurDateTime,108))),108) as Work, 

FROM TTransactionLog1 
WHERE convert(varchar(10),OccurDateTime,103) = '14/03/2013' 
GROUP BY UserID, FirstName, convert(varchar(10),OccurDateTime,103),LastName,Department 

Alors les gars avez une idée ......

+2

pourquoi avez-vous besoin de le convertir en varchar? – Sergio

+0

Donnez la requête complète que vous utilisez. Pour le moment, je ne vois pas le sens de convertir vos temps à 'VARCHAR' –

+0

oui il n'y a pas de sens.peux-tu me dire comment stocker seulement le temps dans Intime – vikky

Répondre

0

Si vous voulez calculer un intervalle entre deux dates, utilisez datediff().

1
WITH A AS (SELECT CONVERT(DATETIME, '16:25:00') InTime) 
SELECT 
CONVERT(varchar(10),CONVERT(DATETIME, '16:30:00') - InTime,108) workDuration 
FROM A 

Sortie: 00:05:00
Je crois que deux convertion vous mènera à faire des calculs datetimepremier et convert à varcharaprès.

2

Vous devriez rechercher Min/Max Datespas pour Min/Max of varchar. Donc, vérifiez les dates avant de les convertir en varchar et convertissez-les comme la dernière chose pour le format requis.

vous devez également utiliser la fonction Datediff pour obtenir le difference of Max and Min dates et quand vous chaîne passant comme des dates, s'il vous plaît utiliser ISO format ('yyyymmdd') qui est NOT culture specific. Sinon, votre requête risque de ne pas fonctionner sur des serveurs avec des paramètres culturels différents.

Je pense requête suivante devrait fonctionner:

SELECT UserID AS EmpCode, FirstName, LastName, Department, 
     --Convert(varchar(10), OccurDateTime, 103) AS Date, 
     Convert(varchar(10), Min(OccurDateTime), 108) AS InTime, 
     Convert(varchar(10), Max(OccurDateTime), 108) AS OutTime, 
     Convert(varchar(10), 
      Datediff(day,Min(OccurDateTime), Max(OccurDateTime)),108) as Work 
FROM TTransactionLog1 
WHERE OccurDateTime = '20130314' --Note: ISO format 
GROUP BY UserID, FirstName, --OccurDateTime, 
     LastName, Department 
+0

oui vous avez raison je vais utiliser le format ISO de la date .... + 1 pour cela .... :) – vikky

Questions connexes