2016-06-17 4 views
0

Ich möchte die Woche eines Quartals von einem SQL-Datum in Oracle zu finden.Wie Woche eines Quartals in Oracle Abfrage

Ich versuchte unter Abfrage, um das Jahr, Quartal und Woche zu finden. Aber die Woche Feld gibt die ‚Woche des Monats‘ nicht die ‚Woche des Quartals‘

wählen to_char (sysdate, ‚YYYY‘) || '-Q' || to_char (sysdate, 'Q') || "-W" || > to_char (sysdate, 'w') als "aktuelle Zeit" von Dual;

Die obige Abfrage gibt '2016-Q2-W3' zurück, da das Datum in der dritten Woche des Monats fällt.

Say sysdate ist '17. Juni 2016' Ich erwarte Ergebnis als

2016-Q2- W12

My Week Bereich (Sonntag - Samstag)

Da der "17. Juni 2016" unter die 12. Woche des Quartals fällt, sollte es W12 sein.

Vielen Dank im Voraus.

+2

Ihre aktuelle Abfrage kann vereinfacht werden: 'select to_char (sysdate, 'YYYY "Q" Q- "W" w') als "Current Time" von dual;' – MT0

+1

SELECT TRUNC (SYSDATE ' Q ') FROM DUAL' gibt '2016-04-01' was ein Freitag ist. Läuft '2016-Q2-W1' von Freitag - Donnerstag? Oder läuft es Montag - Sonntag? Oder etwas anderes? – MT0

Antwort

2

Dies wird die Woche (Sonntag - Samstag) erhalten des Quartals:

SELECT TO_CHAR(SYSDATE, 'YYYY-"Q"Q-"W"') 
    || (7 + TRUNC(SYSDATE + 1, 'IW') - TRUNC(TRUNC(SYSDATE, 'Q') + 1, 'IW'))/7; 
     AS "Current Time" 
FROM DUAL 

Erklärung:

  • Sie können den Sonntag finden die entweder auf-oder-just-vorher war ein gegebenes Datum unter Verwendung von NEXT_DAY(TRUNC(date_value), 'SUNDAY') - 7 (das von der NLS_TERRITORY Einstellung abhängig ist) oder TRUNC(date_value + 1, 'IW') - 1 (das ist kürzer und unabhängig von irgendwelchen Einstellungen).
  • TRUNC(date_value, 'Q') gibt das Datum des ersten Tages des Quartals mit dem Datum value an (d. H. Entweder 1. Januar, 1. April, 1. Juli oder 1. Oktober).
  • Putting die beiden zusammen, der Sonntag auf-oder-just-vor dem ersten Tag des Quartals wird durch TRUNC(TRUNC(date_value, 'Q') + 1, 'IW') - 1
  • Daher gegeben, die Anzahl der Tage zwischen Sonntag auf-oder-just-vor Beginn des Quartal und der Sonntag vor oder vor einem bestimmten Datum ist: (TRUNC(date_value + 1, 'IW') - 1) - (TRUNC(TRUNC(date_value, 'Q') + 1, 'IW') - 1) - die vereinfacht werden kann, indem die -1 Bedingungen stornieren.
  • Der Unterschied der Anzahl der Wochen ist genau diese Zahl dividiert durch 7 (gibt aber einen 0-indizierten Wert und Sie möchten, dass die Wochennummer des Quartals 1-indiziert wird; entweder addieren Sie 1 Woche zum Ergebnis oder vor mache die Division, füge 7 Tage hinzu).
+0

Erklärung bitte. Auch erwarte ich '2016-Q2-W13' für das Datum '19. Juni 2016'. Ihre Lösung gibt "W12" bis zum 23. Juni. – Munesh

+0

'SELECT TRUNC (SYSDATE, 'Q') FROM DUAL' gibt' 2016-04-01', das ist ein Freitag. Läuft '2016-Q2-W1' von Freitag - Donnerstag? Oder läuft es Montag - Sonntag? Oder etwas anderes? – MT0