Subtrahieren Sie die Minute von DateTime in SQL Server 2005
-
22-09-2019 - |
Frage
Angenommen, ich habe ein DateTime -Feld, dessen Wert ist 2000-01-01 08:30:00 und ein Dauerfeld, dessen Wert heißt 00:15 (bedeutet 15 Minuten)
Wenn ich diese beiden subiere, sollte ich bekommen 2000-01-01 08:15:00
Auch wenn ich subtrahieren möchte 1:15 (bedeutet 1 Stunde 15 Minuten), die Ausgabe sollte sein 2000-01-01 07:15:00
ich versuche SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');
Aber die Ausgabe ist 52595055. Wie kann ich das gewünschte Ergebnis erzielen?
Nb ~ wenn ich es tue SELECT dateadd(minute, -15,'2000-01-01 08:30:00');
Ich werde das gewünschte Ergebnis erzielen, aber das beinhaltet das Analysieren des Minute -Feldes.
Bearbeiten:
Gemäß den Antworten schlägt jeder vor, alles in Minuten umzuwandeln und dann zu subtrahieren. Wenn es also 1:30 ist, muss ich 90 Minuten subtrahieren. Das ist gut. Irgendwelche anderen Weg, ohne in Minuten umzuwandeln?
Lösung
SELECT DATEADD(minute, -15, '2000-01-01 08:30:00');
Der zweite Wert (-15 in diesem Fall) muss numerisch sein (dh keine Zeichenfolge wie '00: 15 '). Wenn Sie Stunden und Minuten subtrahieren müssen
SELECT DATEADD(minute, -60 * @h - @m, '2000-01-01 08:30:00');
wobei @h der Stunden Teil Ihrer Zeichenfolge ist und @M der winzige Teil Ihrer Zeichenfolge ist
BEARBEITEN:
Hier ist ein besserer Weg:
SELECT CAST('2000-01-01 08:30:00' as datetime) - CAST('00:15' AS datetime)
Andere Tipps
Sie möchten verwenden DATEADD, mit einer negativen Dauer. z.B
DATEADD(minute, -15, '2000-01-01 08:30:00')
Hast du es versucht
SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')
Datediff ist der Unterschied zwischen 2 Daten.
Ich habe eine Weile versucht, dasselbe zu tun, um das zu subtrahieren hours:minutes
aus datetime
- So hat ich es gemacht:
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
AUSGANG:
DeliveryDate TravelTime DepartureTime
2012-06-02 12:00:00.000 25:49 2012-06-01 10:11:00.000
Verwenden DatePart Um Ihr Intervall auseinander zu ziehen, und DATEADD um die Teile zu subtrahieren:
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'))
Oder wir können zuerst in Minuten konvertieren (obwohl OP es vorziehen würde, nicht):
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')