web-dev-qa-db-fra.com

Soustraire une minute de DateTime dans SQL Server 2005

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?

32
priyanka.bangalore
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)
54
Martin Booth

Vous souhaitez utiliser DATEADD , en utilisant une durée négative. par exemple.

DATEADD(minute, -15, '2000-01-01 08:30:00') 
4
Mitch Wheat

As-tu essayé

SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')

DATEDIFF est la différence entre 2 dates.

3
Adriaan Stander

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 

SORTIE:

DeliveryDate                TravelTime             DepartureTime
2012-06-02 12:00:00.000       25:49         2012-06-01 10:11:00.000
2
Eminem

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')
1
Lachlan Roche