2011-08-09 12 views
9

Wpatrywałam się w to od dłuższego czasu i nie mogę wymyślić, jak to zrobić. Naprawdę nie mam żadnego kodu do opublikowania, ponieważ nie zdążyłem jeszcze go rozgryźć i wszystko, co wymyśliłem, nie ma sensu.Aktualizacja TSQL DATETIME Minutę i sekundy

W każdym razie mamy aplikację, która zbiera dane co 5 minut w oparciu o max (czas_odczytywania) w tabeli (ale także wyświetla rzeczywiste wartości tylko wtedy, gdy czas jest wielokrotnością 5 i wynosi: 00.000 sekund). W większości przypadków jest to w porządku, ale czasami dane zostaną zsynchronizowane i wywołają wiele wartości w naszej tabeli.

Obecnie właśnie wchodzimy, korzystając z najnowszego czasu czytania i kodując nową datę, której chcielibyśmy użyć. Szukam skryptu, którego mogę użyć do zautomatyzowania tego. Na potrzeby tego pytania możemy użyć GETDATE().

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

Odpowiedz

3

Zaokrąglić w dół do najbliższych 5 minut.

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

Co robi 5 * Floor/5.0 w tym przypadku? – Dibstar

+0

@Davin - Minuty dzielone są przez 5,0, aby uzyskać wartość zmiennoprzecinkową zaokrągloną w dół do najbliższej liczby całkowitej za pomocą 'podłogi '. Ta wartość jest pomnożona przez 5, aby powrócić do minut. –

+0

dzięki za to, schludne rzeczy! – Dibstar

4

Spróbuj tego.

Zasadniczo sprawdza minut być dzielona przez 5, 6 sekund i MS przez 1000, a jeśli nie są one odejmuje pozostałą od siebie:

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) 
         ) 
       ) 

wyjściowy:

2011-08-09 08:50:00.000

+0

+1 Życie może być takie proste –

+0

@Lieven - nie zawsze, ale jest fajnie, kiedy jest. – JNK

+0

Dzięki za szybką odpowiedź. Nie jestem pewien, czy facet go skasował, czy też po prostu nie mogę go znaleźć, ale to też zadziałało. DECLARE @readtime DATETIME = DATEADD (minuta, 5 * ROUND (DATEDIFF (minuta, 0, GETDATE())/5, 0), 0) – Tom

Powiązane problemy