Ich habe eine gespeicherte Prozedur, die zwei Datensätze in eine Tabelle einfügt. Der Unterschied zwischen den Datensätzen besteht darin, dass die Zeitspalte des zweiten Datensatzes @MinToAdd
nach dem ersten steht:
CREATE PROCEDURE CreateEntry
/*Other columns*/
@StartTime time(2),
@EndTime time(2),
@MinutesToAdd smallint
AS
BEGIN
SET NOCOUNT ON;
SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed?
IF (@MinutesToAdd > 0)
BEGIN
INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
OUTPUT inserted.id
VALUES
(/*Other columns*/ @StartTime, @EndTime),
(/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
END
ELSE
BEGIN
/*Whatever ELSE does.*/
END
END
Was ist der richtige Weg, um @MinutesToAdd
Minuten zu @StartTime
und hinzuzufügen @EndTime
?
Bitte beachten Sie, dass ich den time
Datentyp verwende.
Update :
Eine korrekte Antwort sollte folgende Informationen enthalten:
- So fügen Sie einem
time
Datentyp Minuten hinzu . - Dass die vorgeschlagene Lösung nicht zu einem Genauigkeitsverlust führt.
- Probleme oder Bedenken, die zu beachten sind, falls das Protokoll zu groß wäre, um in eine
time
Variable zu passen , oder das Risiko eines Rollover dertime
Variablen. Wenn es keine Probleme gibt, geben Sie dies bitte an.
sql-server
sql-server-2008
Trisped
quelle
quelle
Antworten:
Sie können mit den neuen Typen keine faulen Kurzschriftarithmetik verwenden. Versuchen:
Beachten Sie, dass Sie
@MinutesToAdd
das Ergebnis nicht vor Überlauf geschützt haben, obwohl Sie es vor Überlauf geschützt haben. Dies führt jedoch nicht zu einem Fehler, sondern ist möglicherweise nicht das erwartete Ergebnis.Ergebnis:
Ich gehe davon aus, dass dies eine Art interne Konvertierung durchlaufen muss, da Sie dieses Ergebnis nicht erzielen können, wenn Sie sagen:
Ergebnis:
Sie müssen überlegen, wie Sie mit Berechnungen umgehen möchten, die zu einem
@EndTime
oder beiden führen,@StartTime
und@EndTime
am nächsten Tag sein.Um eine weitere neue Anforderung in Ihrer "idealen Antwort" zu erfüllen, gibt es keinen Präzisionsverlust. Gemäß der Dokumentation entspricht der Rückgabetyp von
DATEADD
der Eingabe:Deshalb rein
TIME
,TIME
raus.quelle
DATEADD
derselbe Typ wie das Datumsargument zurückgegeben wird, werde ich akzeptieren. Die Option "Überlauf bei Bedarf verhindern?" Leitung wird nicht benötigt. Das Rollover-Problem wird von der Datenquelle und dem Ziel der Daten behandelt.Verwenden Sie einfach die Funktion dateadd, um Ihre Minuten in Ganzzahl gegen '0:00' zu addieren. Dann zurück in die Zeit werfen.
Wählen Sie Besetzung (Datum (Minute, 84, '0: 00') als Zeit).
Hier ist 84 die ganzzahlige Minute, die ich als "Zeit" -Typ ausdrücken möchte.
Ich habe das zu '0:00' hinzugefügt und dann, um die Datumskomponente zu entfernen, in den Zeittyp umgewandelt. Keine benutzerdefinierte Codierung erforderlich.
(Kein Spaltenname)
01: 24: 00.0000000
quelle