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 DDD
Datumsformatierer (Tag desJahr) und verwenden Sie einige case
Ausdrü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.