SQL - Umrechnung von Jahrtag in Tag/Monat

SQL - Umrechnung von Jahrtag in Tag/Monat

Angenommen, ich habe die folgende Tabelle

+-----------+-------------+
|    DAY    |  LEAP YEAR  |
+-----------+-------------+
|    7      |    true     |
|    167    |    false    |
|    43     |    true     |
|    60     |    true     |
|    256    |    false    |
|    340    |    false    |
+-----------+-------------+

Wie kann man diese Jahrestage nur unter Verwendung von SQL-Funktionen in tatsächliche Tag-/Monatskombinationen „umwandeln“? Das Ergebnis sähe etwa so aus:

+-----------+-------------+------------+
|    DAY    |  LEAP YEAR  |   RESULT   |
+-----------+-------------+------------+
|    7      |    true     |   7 Jan    |
|    167    |    false    |   16 Jun   |
|    43     |    true     |   12 Feb   |
|    60     |    true     |   29 Feb   |
|    256    |    false    |   13 Sep   |
|    340    |    false    |   6 Dec    |
+-----------+-------------+------------+

Antwort1

Eine nette Eigenschaft von Schaltjahren ist, dass sie alle gleich sind (außer bei runden Hundertjahren). Sie können also einfach ein beliebiges Schaltjahr oder Nicht-Schaltjahr auswählen und erhalten für alle anderen das gleiche Ergebnis. Beispielsweise ist 2016 ein Schaltjahr und 2015 nicht. Mit dieser Information können Sie den DDDDatumsformatierer (Tag desJahr) und verwenden Sie einige caseAusdrücke, um die benötigten Informationen zu erhalten:

SELECT TO_CHAR(
         TO_DATE(TO_CHAR(day) || 
                 '-' || 
                 CASE leap_year 
                   WHEN 'true' THEN '2016' 
                   ELSE '2015' 
                 END, 
                'DDD-YYYY'), 
         'dd month') AS result
FROM   my_table

Antwort2

Schnelle und einfache Methode: Wählen Sie ein Jahr, das kein Schaltjahr ist, und eines, das ein Schaltjahr ist. Geben Sie ein Datum = 1. Januar jedes Jahres in zwei Variablen ein. Addieren Sie mithilfe einer CASE-Anweisung (Tageswert - 1) und die jeweils passende Datumsvariable. Verwenden Sie dann entweder eine Case-Anweisung oder mehr SQL, um den Monatsnamen und den Tag aus diesem Ausdruck zu erhalten.

declare @normal_year_nyd date = '1-1-2015';
declare @leap_year_nyd date = '1-1-2016';
select 
  t.[day], -- highly suggest naming this something other than 'day' to avoid ambiguous code
  t.leap_year, 
  datename(month, dateadd(day, t.[day] - 1, 
    case 
      when t.leap_year = 'false' 
        then @normal_year_nyd
      when t.leap_year = 'true'
        then @leap_year_nyd
      end)
  ) as month_name,
  -- do the same as above replacing "month" with "day" in the dateadd expression
from my_table t
where t.leap_year is not null and t.[day] is not null

Wenn Sie Nullen verarbeiten müssen, müssen Sie die Ausdrücke mit der Groß-/Kleinschreibung außen herum neu schreiben und einen Zweig für Nullen hinzufügen.

Wenn dies eine reine Select-Anweisung sein soll, codieren Sie die Daten einfach fest in der Case-Anweisung, anstatt die Variablen zu verwenden.

verwandte Informationen