J'ai une procédure stockée qui insère deux enregistrements dans une table, la différence entre les enregistrements est que la colonne de temps du deuxième enregistrement est @MinToAdd
après le premier:
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
Quelle est la bonne façon d'ajouter des @MinutesToAdd
minutes à @StartTime
et @EndTime
?
Veuillez noter que j'utilise le time
type de données.
Mise à jour :
une réponse correcte doit contenir les informations suivantes:
- Comment ajouter des minutes à un
time
type de données. - Que la solution proposée n'entraîne pas une perte de précision.
- Problèmes ou préoccupations à prendre en compte dans le cas où les minutes seraient trop longues pour tenir dans une
time
variable, ou risque de reconduire latime
variable. S'il n'y a aucun problème, veuillez l'indiquer.
sql-server
sql-server-2008
Trisped
la source
la source
Réponses:
Vous ne pouvez pas utiliser l'arithmétique raccourcie paresseuse avec les nouveaux types. Essayer:
Notez que même si vous avez protégé votre
@MinutesToAdd
contre le débordement, vous n'avez pas protégé le résultat du débordement. Cela ne donne pas d'erreur, cependant, ce n'est peut-être pas le résultat que vous attendez.Résultat:
Je suppose que cela doit passer par un certain type de conversion interne, car vous ne pouvez pas obtenir ce résultat en disant:
Résultat:
Vous devez réfléchir à la façon dont vous souhaitez gérer les calculs qui conduisent à l'un
@EndTime
ou aux deux@StartTime
et@EndTime
être le lendemain.Aussi - pour répondre à une autre nouvelle exigence dans votre "réponse idéale" - il n'y a aucune perte de précision. Selon la documentation , le type de retour de
DATEADD
est le même que l'entrée:Par conséquent, dedans
TIME
,TIME
dehors.la source
DATEADD
renvoie le même type que l'argument date, j'accepterai. Le message "Empêcher le débordement si nécessaire?" la ligne n'est pas nécessaire. Le problème de roulement sera géré par la source des données et la destination des données.Utilisez simplement la fonction dateadd pour ajouter vos minutes en entier contre '0:00'. Puis remonte dans le temps.
Sélectionnez le casting (dateadd (minute, 84, '0: 00') comme heure)
Ici, 84 est la minute entière que je veux exprimer en type "temps".
J'ai ajouté cela à '0:00', puis pour supprimer le composant date, je l'ai casté en type d'heure. Aucun codage personnalisé n'est nécessaire.
(Pas de nom de colonne)
01: 24: 00.0000000
la source