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.