Supposons que j'ai un champ datetime dont la valeur est 2000-01-01 08:30: et un champ duration dont la valeur est disons :15 (ce qui signifie 15 minutes)
Si je soustrais ces deux, je devrais obtenir 2000-01-01 08:15:
Aussi, si je veux soustraire 1:15 (signifie 1 heure 15 minutes), la sortie doit être 2000-01-01 07:15:
J'essaie SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');
Mais la sortie est 52595055. Comment puis-je obtenir le résultat souhaité?
N.B. ~ Si je fais SELECT dateadd(minute, -15,'2000-01-01 08:30:00');
, j'obtiendrai le résultat souhaité mais cela implique l'analyse du champ minute.
Modifier:
Selon les réponses, chacun suggère de tout convertir en minutes puis de soustraire - donc s'il est 1h30, j'ai besoin de soustraire 90 minutes. C'est très bien. De toute autre manière sans convertir en minutes?
SELECT DATEADD(minute, -15, '2000-01-01 08:30:00');
La deuxième valeur (-15 dans ce cas) doit être numérique (c'est-à-dire pas une chaîne comme '00: 15 '). Si vous devez soustraire des heures et des minutes, je recommanderais de diviser la chaîne sur le: pour obtenir les heures et les minutes et soustraire en utilisant quelque chose comme
SELECT DATEADD(minute, -60 * @h - @m, '2000-01-01 08:30:00');
où @h est la partie heure de votre chaîne et @m est la partie minute de votre chaîne
MODIFIER:
Voici une meilleure façon:
SELECT CAST('2000-01-01 08:30:00' as datetime) - CAST('00:15' AS datetime)
Vous souhaitez utiliser DATEADD , en utilisant une durée négative. par exemple.
DATEADD(minute, -15, '2000-01-01 08:30:00')
As-tu essayé
SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')
DATEDIFF est la différence entre 2 dates.
J'ai passé un certain temps à essayer de faire la même chose, à essayer de soustraire le hours:minutes
de datetime
- voici comment je l'ai fait:
convert( varchar, cast((RouteMileage / @average_speed) as integer))+ ':' + convert( varchar, cast((((RouteMileage / @average_speed) - cast((RouteMileage / @average_speed) as integer)) * 60) as integer)) As TravelTime,
dateadd( n, -60 * CAST( (RouteMileage / @average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime
DeliveryDate TravelTime DepartureTime
2012-06-02 12:00:00.000 25:49 2012-06-01 10:11:00.000
Utilisez DATEPART pour séparer votre intervalle, et DATEADD pour soustraire les parties:
select dateadd(
hh,
-1 * datepart(hh, cast('1:15' as datetime)),
dateadd(
mi,
-1 * datepart(mi, cast('1:15' as datetime)),
'2000-01-01 08:30:00'))
ou, nous pouvons d'abord convertir en minutes (bien que OP préfère ne pas le faire):
declare @mins int
select @mins = datepart(mi, cast('1:15' as datetime)) + 60 * datepart(hh, cast('1:15' as datetime))
select dateadd(mi, -1 * @mins, '2000-01-01 08:30:00')