DATESINPERIOD

platí pro:Počítaný sloupecPočítaná tabulkamíravizuální

Poznámka

Tato funkce se nedoporučuje používat ve vizuálních výpočtech, protože pravděpodobně vrací nesmyslné výsledky.

Pro zadání sloupce kalendářního data vrátí tabulku, která obsahuje sloupec kalendářních dat začínající zadaným počátečním datem a pokračuje pro zadané číslo a typ intervalů kalendářních dat.

Pro vstup kalendáře vrátí tabulku, která začíná zadaným počátečním datem a pokračuje pro zadané číslo a typ intervalů kalendářních dat. Tabulka obsahuje všechny primární označené sloupce a všechny sloupce související s časem.

Tato funkce je vhodná k předání jako filtru do CALCULATE funkce. Slouží k filtrování výrazu podle standardních intervalů kalendářních dat, jako jsou dny, měsíce, čtvrtletí nebo roky.

Syntax

DATESINPERIOD(<dates or calendar>, <start_date>, <number_of_intervals>, <interval>[, <endbehavior>])

Parametry

Semestr Definice
dates or calendar Sloupec, který obsahuje kalendářní data nebo odkaz na kalendář
start_date Výraz data. Pokud se používá syntaxe kalendáře, použijte stejný datový typ jako primární sloupec označený kategorií Den.
number_of_intervals Celé číslo, které určuje počet intervalů, které se mají sčítat k kalendářním datům nebo od něj odečítat.
interval Interval, o který se mají data posunout. Hodnota intervalu může být jedna z následujících hodnot: DAY, WEEK, MONTH, QUARTER, a YEAR. Můžete použít WEEK jenom s odkazem na kalendář.
endbehavior Platí jenom v případě, že zadáte odkaz na kalendář. Optional. Určuje, jak se koncové datum zarovná, když je cílový interval delší než rozsah zdroje. Platné hodnoty jsou: PRECISE (výchozí) a ENDALIGNED.

Návratová hodnota

Pro vstup sloupce kalendářního data tabulka obsahující jeden sloupec hodnot kalendářních dat.
Pro vstup kalendáře tabulka, která obsahuje všechny primární označené sloupce a všechny související sloupce času.

Poznámky

  • V nejběžnějším případě použití je dates odkazem na sloupec kalendářních dat označené tabulky kalendářních dat.

  • Pokud je číslo zadané pro number_of_intervals kladné, posunou se data dopředu v čase; pokud je číslo záporné, posunou se data v čase zpět.

  • Parametr interval je výčet. Platné hodnoty jsou DAY, , WEEKMONTH, QUARTERa YEAR. Protože se jedná o výčet, hodnoty se nepředávají jako řetězce. Proto je nezavřete do uvozovek.

  • Pokud endbehavior je k dispozici (pouze časové měřítko kalendáře), DATESINPERIOD předá hodnotu DATEADDparametru Extension . Podrobné příklady najdete v tématu Vysvětlení chování endbehavior .

  • Pro vstup sloupce kalendářních dat může vrácená tabulka obsahovat pouze kalendářní data uložená ve sloupci dates . Pokud například dates sloupec začíná od 1. července 2017 a start_date hodnota je 1. července 2016, vrátí se tabulka od 1. července 2017.

  • Pokud vstupní datum v označeném sloupci dne nenajdete u vstupu kalendáře, výsledek není definován.

  • Pro vstup kalendáře použijte stejný datový typ a formát jako sloupec označený den pro počáteční datum. Pokud například sloupec používá formát RRRR-Sn-Qn-Mnn-Wnn-Dnn (např. "2014-S2-Q4-M11-W45-D03"), musí počáteční datum následovat ve stejném formátu (např. "2015-S2-Q4-M11-W45-D03"). V opačném případě je chování nedefinované.

  • Tato funkce není podporována pro použití v režimu DirectQuery při použití v počítaných sloupcích nebo pravidlech zabezpečení na úrovni řádků (RLS).

Příklad

Následující definice míry Sales tabulky používá funkci DATESINPERIOD k výpočtu výnosů za předchozí rok (PY).

Vzorec používá MAX funkci. Tato funkce vrátí nejnovější datum, které je v kontextu filtru. Funkce DATESINPERIOD tedy vrátí tabulku kalendářních dat počínaje posledním datem za poslední rok.

Příklady v tomto článku můžete použít s ukázkovým modelem Adventure Works DW 2020 Power BI Desktopu. Pokud chcete model získat, podívejte se na DAX ukázkový model.

Revenue PY =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -1, YEAR )
)

Sestava se filtruje podle měsíce června 2020. Funkce MAX vrátí 30. června 2020. Funkce DATESINPERIOD pak vrátí rozsah kalendářních dat od 1. července 2019 do 30. června 2020. Jedná se o rok hodnot kalendářních dat od 30. června 2020 za poslední rok.

Příklad časového měřítka na základě kalendáře

Následující definice míry Sales tabulky používá funkci DATESINPERIOD k výpočtu výnosů za předchozí rok (PY).

Vzorec používá MAX funkci. Tato funkce vrátí nejnovější datum, které je v kontextu filtru. DATESINPERIOD Funkce tedy vrátí primární sloupce začínající od posledního data za poslední rok. Jako příklad použijeme DateKey, abychom ukázali, že kategorii Den lze označit sloupcem, který není zadaný datem.

Příklady v tomto článku můžete použít s ukázkovým modelem Adventure Works DW 2020 Power BI Desktopu. Pokud chcete model získat, podívejte se na DAX ukázkový model.

Revenue PY =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    DATESINPERIOD ( FiscalCalendar, MAX ( 'Date'[DateKey] ), -1, YEAR )
)

Sestava se filtruje podle měsíce června 2020. Funkce MAX vrátí 30. června 2020. Funkce DATESINPERIOD pak vrátí rozsah od 1. července 2019 do 30. června 2020. Je to rok od 30. června 2020 za poslední rok.

Vysvětlení parametru endbehavior pro časové měřítko kalendáře

Interně DATESINPERIOD vypočítá koncovou hranici voláním DATEADD se stejným intervalem, počtem intervalů a endbehavior předanými do DATESINPERIOD. Pokud number_of_intervals je záporná (společná při vrácení okna dozadu), vrátí funkce rozsah (endDate, startDate], kde endDate je datum vrácené DATEADD po posunu kontextu kalendáře, který končístartDate<number_of_intervals><interval>pomocí .<endbehavior> Pro kladné hodnoty je [startDate, endDate)vrácený interval .

  • PRECISE zachová přesnou hodnotu vrácenou DATEADDhodnotou .
  • ENDALIGNED DATEADD EndAligned se řídí sémantikou, přesunutí hranice na konec cílového období, když výběr zdroje již dosáhl vlastního konce. To je užitečné, když kontext filtru už končí posledním dnem období a chcete, aby okno zpětného vyhledávání (například šest měsíců) používalo poslední den posunutého období jako jeho hranice.

Příklad s EndAligned

EndAlignedTest =
    CALCULATE (
        COUNTROWS ( SUMMARIZE ( Sales, 'Date'[MonthName] ) ),
        DATESINPERIOD ( 'Gregorian Calendar', MAX ( 'Date'[Date] ), -6, MONTH, EndAligned )
    )

Tato míra počítá jedinečné názvy měsíců za posledních šest měsíců vzhledem k aktuálnímu kontextu. V EndAlignedpřípadě, že okno udržuje hranici na konci posunutého měsíce, když kontext již končí na hranici měsíce, brání dalším koncovým datům, Precise která Feb 28 by zahrnovala (například by jinak posun na Aug 28, vytažení Aug 29–31 a efektivní rozšíření rozsahu na sedm měsíců). Nastavení EndAligned uchovává počet v tomto scénáři na šest.

Následující porovnání předpokládá, že aktuální kontext filtru končí 28. února 2023 a volání DATESINPERIOD(..., -6, MONTH, <endbehavior>)výrazu . Funkční rozsah je (endDate, startDate], takže endDate vrácený je DATEADD vyloučen, zatímco startDate je zahrnut.

endbehavior DATEADD Enddate DATESINPERIOD rozmezí Názvy měsíců vrácené mírou
Precise 2022-08-28 (2022-08-28, 2023-02-28] → 29. února 2022 – 28. února 2023 Aug, Sep, Oct, Nov, Dec, Jan, Feb (7)
EndAligned 2022-08-31 (2022-08-31, 2023-02-28] → zář 1 2022 – 28. února 2023 Sep, Oct, Nov, Dec, Jan, Feb (6)

Rozdíly v chování mezi klasickým a kalendářním časovým měřítkem

Interně DATESINPERIOD používá stejnou logiku jako DATEADD k určení koncového data od počátečního data a následnému výpočtu rozsahu. Některé scénáře můžou přinést různé výsledky při porovnávání klasického a kalendářního časového měřítka. Například v lunárním roce DATEADD vytváří různé výsledky v datech členitosti, takže výsledek DATESINPERIOD se liší i. V kalendářním časovém měřítku má posun 29. února 2008 zpět jeden rok v 1. maru 2007, protože se považuje za 60. den roku. V klasickém časovém měřítku vrátí stejný posun 28. února 2007. Vzhledem k tomu, že se koncové datum liší, výstup DATESINPERIOD se také liší. Alternativním řešením je použít DATEADDk výpočtu koncového data (Calendar, -<number of a year>, month). Pokud má například rok v kalendáři 13 měsíců, použijte DATEADD(Kalendář, -13, měsíc). Tento přístup se posune o měsíc, takže únor 2008 přejde na únor 2007. Potom napište vlastní dataInPeriod na základě nového koncového data.