Dies ist Abbildung 10-41 aus dem SQL-Lehrbuch von Casteel 12c.

Das Buch enthält ein Beispiel, das auf meinem lokalen SQL-Entwickler ausgeführt wird und die falsche Anzahl von Jahren zurückgibt, da davon ausgegangen wird, dass die Abfrage für 1909 und nicht für 2009 gilt.

select empno, lname, fname,hiredate,
    ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-09')/12,2) "Years",
    case
        when (months_between('01-JUL-09', hiredate)/12) < 4 then 'Level 1'
        when (months_between('01-JUL-09', hiredate)/12) < 8 then 'Level 2'
        when (months_between('01-JUL-09', hiredate)/12) < 11 then 'Level 3'
        when (months_between('01-JUL-09', hiredate)/12) < 15 then 'Level 4'
        else 'Level 5'
    end "Retire Level"
from employees;

Rückgabe im Bereich von 82 bis 89 Jahren (bis zu 2 Dezimalstellen), aber im Lehrbuch wird ein Rückgabewertbereich von 10 bis 17 Jahren angezeigt, da die Berechnung für 2009 ordnungsgemäß durchgeführt wird.

Also habe ich es in 2009 geändert, aber das gleiche Ergebnis erhalten:

select empno, lname, fname,hiredate,
    ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-2009')/12,2) "Years",
    case
        when (months_between('01-JUL-2009', hiredate)/12) < 4 then 'Level 1'
        when (months_between('01-JUL-2009', hiredate)/12) < 8 then 'Level 2'
        when (months_between('01-JUL-2009', hiredate)/12) < 11 then 'Level 3'
        when (months_between('01-JUL-2009', hiredate)/12) < 15 then 'Level 4'
        else 'Level 5'
    end "Retire Level"
from employees;

Wie kann ich SQL mitteilen, dass es 2009 für die Berechnung von month_between ist?

-1
mLstudent33 22 Feb. 2020 im 04:55

3 Antworten

Beste Antwort

Wie kann ich SQL mitteilen, dass es 2009 für die Berechnung von month_between ist?

Seien Sie genau (verlassen Sie sich nicht auf die Standardinterpretation von Datumsliteralen), verwenden Sie DATE oder TO_DATE(), z.

DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')

DATE erfordert ein JJJJ-MM-TT-Literal. Mit TO_DATE() können Sie das zu verwendende Literalmuster angeben. Siehe Datumsliterale

Ps: Ich persönlich mag es nicht, gesprochene sprachabhängige Datumsliterale oder zweistellige Jahresreferenzen zu verwenden

2
Used_By_Already 22 Feb. 2020 im 03:49

Bei zweistelligen Jahren können Sie das RR-Datumsformat verwenden, sodass 00 bis 49 als aktuelles Jahrhundert (und 50 bis 99 als nächstes Jahrhundert) verwendet werden.

TO_DATE('01-JUL-09', 'DD-MON-RR')

Sehen : http: // docs.oracle.com/database/122/SQLRF/Format-Models.htm#GUID-6C75461E-2E18-4C35-9EB4-038A7E1C9C1F

Auch etwas außerhalb meines Wissensbereichs, aber ich denke, Sie können dieses Datumsformat mit NLS_DATE_FORMAT als Standard festlegen. Führen Sie also eine Suche nach diesem Begriff durch - z

https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams122.htm#REFRN10119

0
racraman 22 Feb. 2020 im 02:38

Versuchen Sie, Ihre Zeichenfolgendaten mit TO_DATE ex in tatsächliche Daten umzuwandeln. TO_DATE('01-JUL-2009', 'dd-MON-YYYY')

0
crimson589 22 Feb. 2020 im 02:00