İşlevler kullanılarak en yakın dakikaya ve en yakın saate yuvarlanan T-SQL tarih saati


113

SQL server 2008'de, datetime sütununu 2008'de tercihen mevcut fonksiyonlarla en yakın saate ve en yakın dakikaya yuvarlatmak istiyorum.

Bu sütun değeri 2007-09-22 15:07:38.850için çıktı şöyle görünecektir:

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour

6
En yakın dakika örneğinin 15:08 olması gerekmez mi? Bir dakikadaki saniye 60 olduğu için ...
OMG Ponies

Bu yorumu yapabilmek için sorusunu düzenlerken kasıtlı olarak bu hatayı düzeltmediniz mi?
Bay Çarşamba

@MrWed Wednesday Düzenleme ile yorum arasında 10 dakikadan fazla zaman olduğunun farkındasınız. Düşüncenin daha sonra gerçekleştiğini tahmin ediyorum.
lc.

Yanıtlar:


208
declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

dönecek

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

Yukarıdakiler, soruda istenen sonuçları üreterek saniyeleri ve dakikaları kısaltır. @OMG Ponies'in de belirttiği gibi, yukarı / aşağı yuvarlamak istiyorsanız, sırasıyla yarım dakika veya yarım saat ekleyebilir ve sonra kesebilirsiniz:

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

ve alacaksın:

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

SQL Server 2008'de tarih veri türü eklenmeden önce, yalnızca tarihi almak için bir tarih saatinden saat bölümünü kesmek için yukarıdaki yöntemi kullanırdım. Buradaki fikir, söz konusu tarih saat ile sabit bir zaman noktası arasındaki gün sayısını belirlemektir ( 0örtük olarak aşağıdakilere dönüşür 1900-01-01 00:00:00.000):

declare @days int
set @days = datediff(day, 0, @dt)

ve sonra bu gün sayısını sabit zaman noktasına ekleyin, bu size saatin ayarlandığı orijinal tarihi verir 00:00:00.000:

select dateadd(day, @days, 0)

veya daha kısaca:

select dateadd(day, datediff(day, 0, @dt), 0)

Farklı DATEPART kullanarak (örneğin hour, mi) buna göre çalışacaktır.


2
Başka birinin bununla karşılaşacağından şüpheliyim, ancak YUKARI en yakın saniyeye yuvarlamaya ve 500 milisaniyeye eklemeye çalışıyorsanız, dateiff (saniye, '1/1/2000', .... vs tarihliiff) yapmak isteyeceksiniz. (saniye, 0 .... taşma hatası alacağınız için. 0'dan saniyeler çok büyük sanırım.
Eric Twilegar

'1 Ocak 1900'den bu yana 1 Ocak 1900'e kadar olan saat sayısını ekleyin' - Bununla çirkin göründüğü Java / SQL'de karşılaştım. Benim durumumda, gerçekten Java tarafında yapılmış olmalıydı.
Corwin Newall

İle hesaplamaları için datetimeoffsetben yerine zorunda 0olan TODATETIMEOFFSET('1900-01-01 00:00:00', 0)kaçınmak için sonuç üzerine yerel saat dilimini zorlayarak.
krlmlr

26

Sizin örneğinizde olduğu gibi "yuvarlanmıştır". Bu, tarihin varchar değerini döndürecektir.

DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'

SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15

CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
Varchar'ı

10

Bu sorunun çok eski olduğunu ve kabul edilmiş ve alternatif bir yanıt olduğunu fark ediyorum. Ayrıca cevabımın sorunun yalnızca yarısını yanıtlayacağının da farkındayım, ancak en yakın dakikaya yuvarlamak ve yalnızca tek bir işlevi kullanarak tarih saat uyumlu bir değere sahip olmak isteyen herkes için :

CAST(YourValueHere as smalldatetime);

Saatler veya saniyeler için, Jeff Ogata'nın yukarıdaki cevabını (kabul edilen cevap) kullanın.


1
Mükemmel cevap, yuvarlak olduğunu ve sadece kesilmediğini doğruladım. Bu seçeneği arayanlar için, smalldatetimeSQL 2008'de eklendi.
BradC

Tablonuzda dakikası dakikasına zaman aşımı gerektiren bazı verileri düzeltmeniz gerekiyorsa, bu en iyi seçenektir.
Şifreleme

-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

saniyeyi 00'a yuvarlar


Çok yavaş ve OP'nin istediği gibi yuvarlanmıyor, ancak sormadığı için aşağı yuvarlanıyor. (Feragatname - Size
Tersine Mühendisi
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.