Bir zaman veri türüne nasıl dakika eklerim?


10

Bir tabloya iki kayıt ekler saklı yordam var, kayıtları arasındaki fark ikinci kaydın zaman sütunu @MinToAddilk sonra olmasıdır:

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

Eklemek için doğru yolu nedir @MinutesToAdddakika @StartTimeve @EndTime? Veri türünü
kullandığımı lütfen unutmayın time.

Güncelleme :
Doğru bir cevap aşağıdaki bilgileri içermelidir:

  • Bir timeveri türüne dakika nasıl eklenir .
  • Önerilen çözümün hassasiyet kaybına yol açmaması.
  • Dakikaların bir timedeğişkene sığmayacak kadar büyük olması veya timedeğişkenin devrilme riski olması durumunda dikkat edilmesi gereken hususlar veya endişeler . Sorun yoksa, lütfen bunu belirtin.

5
Sorunuzda yaptığınız düzenlemenin, eldeki soruyu nasıl netleştirdiğini görmüyorum.
— swasheck

@swasheck Aradığım üç şeyi açıkça belirtiyorum. Ayrıca aramadıklarım için sınırlar koydum.
— Ocak'ta Trisped

Yanıtlar:


36

Yeni tiplerle tembel stenografi aritmetiği kullanamazsınız. Deneyin:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

@MinutesToAddTaşma durumunuzu korumuş olsanız bile , sonucu taşmalardan korumadığınızı unutmayın. Bu bir hata vermez, ancak beklediğiniz sonuç olmayabilir.

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

Sonuç:

00:19:00

Bunun bir tür dahili dönüşümden geçmesi gerektiğini varsayıyorum, çünkü bu sonucu söyleyemediniz:

DECLARE @StartTime TIME(0) = '24:19';

Sonuç:

Msg 241, Seviye 16, Durum 1, Satır 1
Karakter dizesinden tarih ve / veya saat dönüştürülürken dönüşüm başarısız oldu.

Sen hesaplamalar işlemek istiyorum nasıl dikkate almak gerekir için kurşun bu da @EndTimeveya her ikisi @StartTimeve @EndTimebir sonraki gün olmak.

Ayrıca - "ideal cevabınızda" başka bir yeni gereksinimi karşılamak için - hassasiyet kaybı yoktur. Gereğince belgeleri , dönüş türü DATEADDgirdi olarak aynıdır:

Dönüş veri türü, dize değişmez değerleri hariç , tarih bağımsız değişkeninin veri türüdür .

Bu nedenle, içeri TIME, TIMEdışarı.


1
+1 @Aaron Alternatif olarak StartTime ve TimeToAdd öğelerini datetime biçimine dönüştürebilir ve sonra ekleyebilirsiniz. Dakikalar> 59 olduğunda TimeToAdd dönüştürmek çok karışık olacaktır. DATEADD en iyi çözümdür.
— brian

DATEADDTarih bağımsız değişkeni ile aynı türü döndüren eklerseniz , kabul edeceğim. "Gerekirse taşmayı önler misiniz?" satır gerekli değildir. Devrilme sorunu verinin kaynağı ve verinin hedefi tarafından ele alınacaktır.
— Trisped

3
@ DATEADD'ın uygun olmadığını düşündüğünüz soruyu eklerseniz, yalnızca DATETIME değerini döndürebileceğini ve bunun sorunlara neden olabileceğini düşündüğünüzden emin oldunuz. Aksi takdirde sorunuzla veya gelecekteki okuyucularla alakalı görünmüyor ...
— Aaron Bertrand

"Zaman veri türünü kullandığımı lütfen unutmayın" ile alaka düzeyi nasıl ima edilmiyor? Ayrıca, sorumu neden kayıt yerine satır kullanmamak için değiştirdiniz?
— Trisped

1
@Trisped düzenleme daha iyi terminoloji kullanır ve lütfen düzenleme ile ilgili sss bakın - artık geri ve ileri olmayan ya da soruyu kilitleyeceğim. Aaron, her şeyi başkaları için açıklığa kavuşturmamız gerektiğinde haklısın, cevabın var. Lütfen sorunuzu faydalı olacağını düşündüğünüz satırlarda düzenlemeyi düşünün: Aaron, istediğiniz bilgiyi cevabına eklemeyi teklif etti.
— Jack diyor ki topanswers.xyz

0

Dakikalarınızı '0:00' ile tam sayı olarak eklemek için dateadd işlevini kullanmanız yeterlidir. Sonra zamana geri döndü.

Kadro seç (dateadd (dakika, 84, '0: 00') zaman olarak)

Burada 84, "zaman" türünde ifade etmek istediğim tamsayı dakikadır.

Bunu '0:00' öğesine ekledim ve sonra tarih bileşenini kaldırmak için, zaman türüne aktardım. Özel kodlamaya gerek yoktur.

(Sütun adı yok)

01: 24: 00,0000000

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.