Ich habe eine DATE
Spalte, die ich auf die nächsten unteren 10 Minuten Intervall in einer Abfrage runden (siehe Beispiel unten).Rund Datum bis 10 Minuten Intervall
Ich schaffte es, indem Sie die Sekunden abgeschnitten und dann die letzte Stelle der Minuten subtrahieren.
WITH test_data AS (
SELECT TO_DATE('2010-01-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:05:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:09:59', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2010-01-01 10:10:00', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
UNION SELECT TO_DATE('2099-01-01 10:00:33', 'YYYY-MM-DD HH24:MI:SS') d FROM dual
)
-- #end of test-data
SELECT
d, TRUNC(d, 'MI') - MOD(TO_CHAR(d, 'MI'), 10)/(24 * 60)
FROM test_data
Und hier ist das Ergebnis:
01.01.2010 10: 00:00 01.01.2010 10: 00:00
01.01.2010 10: 05 01.01.2010 00 10: 00:00
01.01.2010 10: 09:59 01.01.2010 10: 00:00
01.01.2010 10: 10:00 01.01.2010 10: 10:00
01.01.2099 10: 00 : 33 2099.01.01 10: 00:00
funktioniert wie erwartet, aber gibt es einen besseren Weg?
EDIT:
Ich war neugierig auf die Leistung, so habe ich den folgenden Test mit 500.000 Zeilen und (nicht wirklich) Zufallsdaten. Ich werde die Ergebnisse als Kommentare zu den bereitgestellten Lösungen hinzufügen.
DECLARE
t TIMESTAMP := SYSTIMESTAMP;
BEGIN
FOR i IN (
WITH test_data AS (
SELECT SYSDATE + ROWNUM/5000 d FROM dual
CONNECT BY ROWNUM <= 500000
)
SELECT TRUNC(d, 'MI') - MOD(TO_CHAR(d, 'MI'), 10)/(24 * 60)
FROM test_data
)
LOOP
NULL;
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t);
END;
Dieser Ansatz dauerte 03.24 s
.
Was ist 'SELECT CASE WHEN TO_CHAR (date_col, 'MI') zwischen 0 und 10 THEN TO_DATE (TO_CHAR (date_col, 'YYYY') || '-' || TO_CHAR (Datum_Zeichen, 'MM') || '-' || TO_CHAR (Datum_Zeichen, 'DD') || '' || TO_CHAR (Datum_Zeichen, 'HH') || ': 00' , 'JJJJ-MM-TT HH: MI') END'? –
@OMG Ponys: Sorry, aber das gibt die volle Stunde zurück, wenn '0 <= MI <= 10', sonst' NULL'. –
Ich wollte nicht mit dem Rest der WHEN –