2017-03-13 2 views
1

Ich habe zwei Datumsfelder in einer Datenbank namens „EFFECTIVE_DATE“ und „point_date“Oracle SQL Erstellungsdatum von Parts

Wie ich ein neues Datumsfeld erstellen Sie, wo das Datum oben aus dem Jahr von „EFFECTIVE_DATE gemacht ", der Monat" POINT_DATE "und der Tag von" POINT_DATE "?

Ich würde normalerweise Datefromparts verwenden, aber dies ist eine Oracle-Datenbank nicht Microsoft

Mit freundlichen Grüßen

+0

Es mag einen eleganteren Weg geben, aber 'TO_CHAR()' und 'TO_DATE()' sollten funktionieren. Sie können auch 'EXTRACT()' verwenden. Der schwierige Teil besteht darin sicherzustellen, dass Sie nicht mit ungültigen Daten enden, z. 'Feb 31'. –

Antwort

1

alle coulmns sind DATE Datentypen Unter der Annahme, können Sie dies ein

TO_DATE(TO_CHAR(EFFECTIVE_DATE, 'YYYY') || TO_CHAR(POINT_DATE, 'MMDD'), 'YYYYMMDD') 

Beachten Sie, verwenden von Schaltjahren!

1

Hmmm. . . dies erzeugt eine schöne Zeichenfolge im YYYY-MM-DD-Format:

select to_char(effective_date, 'YYYY') || '-' || to_char(point_date, 'MM-DD') 

Und das parst es zu einem Datum zurück:

select to_date(to_char(effective_date, 'YYYY') || '-' || to_char(point_date, 'MM-DD'), 'YYYY-MM-DD') 

Hinweis: Sie könnten etwa 29. Februar vorsichtig sein soll.

+0

Und seien Sie vorsichtig bei Daten wie 31. Juni. – unleashed

+0

@unleashed. . . Ich sehe nicht, wie das Produkt am 31. Juni aussehen würde. Ich sehe, wie es 2017-02-29 produzieren würde. –

+0

Mein schlechtes. Zu dieser Zeit dachte ich, es würde nur einen Tag nach dem zweiten Date dauern. Wenn es einen gültigen Tag UND einen Monat braucht, ist das in Ordnung, außer für 2/29 Szenarien. – unleashed

2

Hier ist ein Ansatz mit ADD_MONTHS und EXTRACT(YEAR FROM ....). Sie addieren oder subtrahieren einfach die benötigte Anzahl von Monaten (immer ein Vielfaches von 12, da Sie nur das Jahr wechseln). Im Gegensatz zu den Lösungen TO_CHAR/TO_DATE behandelt dieser Ansatz Schalttage (29. Februar). Auf der anderen Seite wird darauf hingewiesen, dass die Änderung des Datums vom 28. Februar 2003 auf das Jahr 2012 den 29. Februar ändert (ADD_MONTHS ändert den letzten Tag eines Monats auf den letzten Tag des resultierenden Monats).

with 
    inputs as (
     select date '2013-03-22' as effective_date, 
       date '2017-08-14' as point_date 
     from dual 
    ) 
-- end of TEST data (do not include in the solution!) 
select effective_date, point_date, 
     add_months(point_date, 12 * (extract (year from effective_date) - 
            extract (year from point_date) ) 
       ) as mixed_date 
from inputs; 

EFFECTIVE_DATE POINT_DATE MIXED_DATE 
-------------- ---------- ---------- 
03/22/2013  08/14/2017 08/14/2013