2011-08-09 14 views
9

Uzun bir süredir bu konuya bakıyordum ve bunun nasıl yapılacağını anlayamıyorum. Göndermem gereken herhangi bir kodum yok çünkü henüz bunu anlamaya bile yaklaşmamıştım ve bulduğum her şey bir anlam ifade etmiyor. NeyseTSQL Güncelleştirmesi DATETIME Dakika ve Saniye

, biz tabloda max (readtime) dayalı veri her 5 dakikada toplayan bir uygulama var (zaman 5 katı olduğu ve en ise aynı zamanda tek gerçek değerlerini gösterecektir. 00.000 saniye) Çoğunlukla, bu iyi, ancak bazen veriler senkronizasyondan çıkacak ve tablonuzda bir grup 0 değerine neden olacaktır.

Şu anda, en yeni okuma süresini kapıp, kullanmak istediğimiz yeni tarihi kodlamaya devam ediyoruz. Bunu otomatikleştirmek için kullanabileceğim bir senaryo arıyorum. Bu sorunun amaçları için GETDATE() kullanabiliriz.

DECLARE @readtime DATETIME = GETDATE() --2011-08-09 08:51:19.237 
      -- I want it to look like 2011-08-09 08:50:00.000 

cevap

3

En yakın 5 dakikaya kadar aşağı yuvarlayın.

DECLARE @readtime DATETIME = 
    DATEADD(minute, 5*FLOOR(DATEDIFF(minute, 0, GETDATE())/5.0), 0) 
+0

5 * Floor/5.0 bu durumda ne yapıyor? – Dibstar

+0

@Davin - Dakika, "floor" kullanılarak en yakın tam sayıya yuvarlanan bir float değeri almak için 5.0'a bölünür. Bu değer tekrar 5'e geri dönmek için 5 ile çarpılır. O, düzgün şeyler için –

+0

teşekkürler! – Dibstar

4

Bunu deneyin.

Temelde 1000 ile, 5 ile bölünebilir olması 6 ile saniye ve ms dakika kontrol eder ve bunlar değilse her kalanı çıkarır:

DECLARE @dt datetime = '2011-08-09 08:51:19.237' 

SELECT DATEADD(
       MILLISECOND, 
       -(DATEPART(MILLISECOND, @dt) % 1000), 
       DATEADD(
         SECOND, 
         -(DATEPART(second, @dt) % 60), 
         DATEADD(
           minute, 
           -(DATEPART(minute, @dt) % 5), @dt) 
         ) 
       ) 

Çıkış:

2011-08-09 08:50:00.000

+0

+1 Hayat bu kadar basit olabilir –

+0

@Lieven - her zaman değil, ancak durum güzel. – JNK

+0

Hızlı yanıt için teşekkürler. Adamın onu silmiş mi, yoksa onu bulamıyorsam, bu da işe yaradı mı? DECLARE @readtime DATETIME = DATEADD (dakika, 5 * YUVARLAK (DATEDIFF (dakika, 0, GETDATE())/5, 0), 0) – Tom

İlgili konular