Power Query, benutzerdefinierte Funktion GetTableOfDateAndDatetime
Flexibles Erstellen einer Datumstabelle mit benutzerdefinierter M Code Funktion.
weitere Datumsfunktionen
Folgenden M Code in eine neue Abfrage kopieren (Funktionsname GetTableOfDateAndDatetime)
--- SCHNIPP ---
let
fn = (Start as any, End as any, Schritt as number, Einheit as text, DatumUndUhrzeitTrennen as text) as table =>
let
TypeStart = GetTypeAsText(Start),
TypeEnde = GetTypeAsText(End),
GetTypeAsText = (Value as any) as text =>
let
NonNullableType = Type.NonNullable(Value.Type(Value)),
FindType =
if Type.Is(NonNullableType, type date) then "date"
else if Type.Is(NonNullableType, type datetime) then "datetime"
else error "unbekannter Datentyp"
in
FindType,
//haben beide Parameter den gleichen Datentyp ?
Output =
if TypeStart <> TypeEnde then
Table.FromList({"Eingabe Datumswerte haben unterschiedliche Datentypen!"})
//ist der Datentyp date oder datetime?
else if GetTypeAsText(Start) = "unbekannter Datentyp" then
Table.FromList({"Datumswerte müssen vom Datentyp date oder datetime sein!"})
//ist Start > End ?
else if Start > End then
Table.FromList({"Ende Parameter muß größer sein als Start Parameter!"})
//ist "Schritt" positiv ?
else if Schritt < 0 then
Table.FromList({"Schritt muss eine positive Nummer sein!"})
else
try
Table.TransformColumnTypes(
Table.FromList(
List.Generate(
()=>Number.From(Start),
each _ <= Number.From(End),
each _ +
(
if Einheit = "Tag" then
Schritt
else if Einheit = "Stunde" then
Schritt/24
else if Einheit = "Minute" then
Schritt/24/60
else Schritt/24/60/60
)
),
Splitter.SplitByNothing(), null, null, ExtraValues.Error),
//{{"Column1", Value.Type(Start)}}
{{"Column1", if Einheit = "Tag" then type date else type datetime}}
)
otherwise Table.FromList({"Error"}),
OutputSplit =
if DatumUndUhrzeitTrennen = "ja" then
if Einheit <> "Tag" then
//Split Date and time
Table.RemoveColumns(
Table.AddColumn(
Table.AddColumn(Output, "Date", each DateTime.Date([Column1]), type date),
"Time", each DateTime.Time([Column1]), type time
),{"Column1"}
)
else
Output
else
Output
in
OutputSplit,
fnType = type function(
Start as any,
Ende as any,
Schritt as number,
Einheit as (type text meta [Documentation.AllowedValues =
{"Tag", "Stunde", "Minute", "Sekunde"}]),
DatumUndUhrzeitTrennen as (type text meta [Documentation.AllowedValues={"ja", "nein"}])
) as list meta [
Documentation.Name = "GetTableOfDateAndDateTime",
Documentation.LongDescription =
"Einfaches Erstellen einer Spalte mit date oder datetime Werten,
mit jedem positiven Inkrement für Tag-, Stunde-, Minute-
oder Sekunde-Level.",
Documentation.Author = "Lars Schreiber, www.ssbi-blog.de"
]
in
Value.ReplaceType(fn, fnType)
--- SCHNAPP ---
weiterführende Informationen siehe hier
weitere Datumsfunktionen
Folgenden M Code in eine neue Abfrage kopieren (Funktionsname GetTableOfDateAndDatetime)
--- SCHNIPP ---
let
fn = (Start as any, End as any, Schritt as number, Einheit as text, DatumUndUhrzeitTrennen as text) as table =>
let
TypeStart = GetTypeAsText(Start),
TypeEnde = GetTypeAsText(End),
GetTypeAsText = (Value as any) as text =>
let
NonNullableType = Type.NonNullable(Value.Type(Value)),
FindType =
if Type.Is(NonNullableType, type date) then "date"
else if Type.Is(NonNullableType, type datetime) then "datetime"
else error "unbekannter Datentyp"
in
FindType,
//haben beide Parameter den gleichen Datentyp ?
Output =
if TypeStart <> TypeEnde then
Table.FromList({"Eingabe Datumswerte haben unterschiedliche Datentypen!"})
//ist der Datentyp date oder datetime?
else if GetTypeAsText(Start) = "unbekannter Datentyp" then
Table.FromList({"Datumswerte müssen vom Datentyp date oder datetime sein!"})
//ist Start > End ?
else if Start > End then
Table.FromList({"Ende Parameter muß größer sein als Start Parameter!"})
//ist "Schritt" positiv ?
else if Schritt < 0 then
Table.FromList({"Schritt muss eine positive Nummer sein!"})
else
try
Table.TransformColumnTypes(
Table.FromList(
List.Generate(
()=>Number.From(Start),
each _ <= Number.From(End),
each _ +
(
if Einheit = "Tag" then
Schritt
else if Einheit = "Stunde" then
Schritt/24
else if Einheit = "Minute" then
Schritt/24/60
else Schritt/24/60/60
)
),
Splitter.SplitByNothing(), null, null, ExtraValues.Error),
//{{"Column1", Value.Type(Start)}}
{{"Column1", if Einheit = "Tag" then type date else type datetime}}
)
otherwise Table.FromList({"Error"}),
OutputSplit =
if DatumUndUhrzeitTrennen = "ja" then
if Einheit <> "Tag" then
//Split Date and time
Table.RemoveColumns(
Table.AddColumn(
Table.AddColumn(Output, "Date", each DateTime.Date([Column1]), type date),
"Time", each DateTime.Time([Column1]), type time
),{"Column1"}
)
else
Output
else
Output
in
OutputSplit,
fnType = type function(
Start as any,
Ende as any,
Schritt as number,
Einheit as (type text meta [Documentation.AllowedValues =
{"Tag", "Stunde", "Minute", "Sekunde"}]),
DatumUndUhrzeitTrennen as (type text meta [Documentation.AllowedValues={"ja", "nein"}])
) as list meta [
Documentation.Name = "GetTableOfDateAndDateTime",
Documentation.LongDescription =
"Einfaches Erstellen einer Spalte mit date oder datetime Werten,
mit jedem positiven Inkrement für Tag-, Stunde-, Minute-
oder Sekunde-Level.",
Documentation.Author = "Lars Schreiber, www.ssbi-blog.de"
]
in
Value.ReplaceType(fn, fnType)
--- SCHNAPP ---
weiterführende Informationen siehe hier
Kommentare
Kommentar veröffentlichen