<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Rolling DATEDIFF in Quick Measures Gallery</title>
    <link>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Rolling-DATEDIFF/m-p/3984344#M1099</link>
    <description>&lt;P&gt;Look, let's not beat around the bush. The DATEDIFF function in DAX is a bit scuff. At best it is syntax sugar for subtraction. At worst, it thinks that December 31st, 2023 and January 1st, 2024 are 1 year apart. Not exactly helpful. Instead, these quick measures implement a rolling DATEDIFF. Day, Hour, Minute and Second versions are not exactly rolling but instead just use simple math versus black box magic. The Month, Quarter, Year, and Week versions are rolling measures.&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Month = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX( [Purchase Date] )
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Months = SELECTCOLUMNS( GENERATESERIES(1, 12, 1), "__Month", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Months ), "__Date", DATE( [__Year], [__Month], DAY( __Date1 ) ) )
    VAR __Table1 = FILTER( __Table, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult - 1, __PreResult * __Multiplier )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Quarter = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Quarters = SELECTCOLUMNS( GENERATESERIES( 1, 4, 1 ), "__Quarter", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Quarters ), "__YearQuarter", [__Year] * 100 + [__Quarter] )
    VAR __Count = COUNTROWS( FILTER( __Table, [__YearQuarter] &amp;lt;= YEAR( __MaxDate ) * 100 + QUARTER( __MaxDate ) &amp;amp;&amp;amp; [__YearQuarter] &amp;gt;= YEAR( __MinDate ) * 100 + QUARTER( __MinDate ) ) )
    VAR __RollingQuartersTable = 
        ADDCOLUMNS(
            GENERATESERIES( 1, __Count, 1 ),
            "__Date", 
                VAR __EOM = EOMONTH( __Date1, 3 * [Value] * __Multiplier * -1  )
                VAR __Result = DATE( YEAR( __EOM ), MONTH( __EOM ), DAY( __Date1 ) )
            RETURN
                __Result
        )
    VAR __Table1 = FILTER( __RollingQuartersTable, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult, ( __PreResult + 1 ) * __Multiplier )
RETURN
    __Result + 0&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Year = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Table = ADDCOLUMNS( __Years, "__Date", DATE( [__Year], MONTH( __Date1 ), DAY( __Date1 ) ) )
    VAR __Table1 = FILTER( __Table, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult - 1, __PreResult * __Multiplier )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Week = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Weeks = SELECTCOLUMNS( GENERATESERIES( 1, 53, 1 ), "__Week", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Weeks ), "__YearQuarter", [__Year] * 100 + [__Week] )
    VAR __Count = COUNTROWS( FILTER( __Table, [__YearQuarter] &amp;lt;= YEAR( __MaxDate ) * 100 + WEEKNUM( __MaxDate ) &amp;amp;&amp;amp; [__YearQuarter] &amp;gt;= YEAR( __MinDate ) * 100 + WEEKNUM( __MinDate ) ) )
    VAR __RollingWeeksTable = 
        ADDCOLUMNS(
            GENERATESERIES( 1, __Count, 1 ),
            "__Date", __Date1 + 7 * [Value] * __Multiplier * -1
        )
    VAR __Table1 = FILTER( __RollingWeeksTable, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult, ( __PreResult + 1 ) * __Multiplier )
RETURN
    __Result + 0&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Day = TRUNC( ( [Today] - MAX( 'Table'[Purchase Date] ) ) * 1 )&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Hour = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Hours = __Base * 24
    VAR __Result = IF( __Hours &amp;gt; 0, ROUNDUP( __Hours, 0), TRUNC( __Hours ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Minute = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Minutes = __Base * 24 * 60
    VAR __Result = IF( __Minutes &amp;gt; 0, ROUNDUP( __Minutes, 0), TRUNC( __Minutes ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Second = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Seconds = __Base * 24 * 60 * 60
    VAR __Result = IF( __Seconds &amp;gt; 0, ROUNDUP( __Seconds, 0), TRUNC( __Seconds ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Learn more here in these videos:&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/xE0FfRmLUOI" data-video-remote-vid="https://youtu.be/xE0FfRmLUOI" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FxE0FfRmLUOI%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DxE0FfRmLUOI&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FxE0FfRmLUOI%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/iJ_gLzm14H0" data-video-remote-vid="https://youtu.be/iJ_gLzm14H0" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FiJ_gLzm14H0%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DiJ_gLzm14H0&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FiJ_gLzm14H0%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="reportid hidden"&gt;eyJrIjoiNTcwZTVmMjMtNTFjYS00ZjM1LWI0YTEtOTBlZTYxOGU5Njk4IiwidCI6Ijg3NDlmOWI5LWYzMmQtNDdhMS1hMjI0LTM2OTQxOGFlMmY1MSJ9&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 10 Jun 2024 19:23:49 GMT</pubDate>
    <dc:creator>Greg_Deckler</dc:creator>
    <dc:date>2024-06-10T19:23:49Z</dc:date>
    <item>
      <title>Rolling DATEDIFF</title>
      <link>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Rolling-DATEDIFF/m-p/3984344#M1099</link>
      <description>&lt;P&gt;Look, let's not beat around the bush. The DATEDIFF function in DAX is a bit scuff. At best it is syntax sugar for subtraction. At worst, it thinks that December 31st, 2023 and January 1st, 2024 are 1 year apart. Not exactly helpful. Instead, these quick measures implement a rolling DATEDIFF. Day, Hour, Minute and Second versions are not exactly rolling but instead just use simple math versus black box magic. The Month, Quarter, Year, and Week versions are rolling measures.&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Month = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX( [Purchase Date] )
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Months = SELECTCOLUMNS( GENERATESERIES(1, 12, 1), "__Month", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Months ), "__Date", DATE( [__Year], [__Month], DAY( __Date1 ) ) )
    VAR __Table1 = FILTER( __Table, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult - 1, __PreResult * __Multiplier )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Quarter = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Quarters = SELECTCOLUMNS( GENERATESERIES( 1, 4, 1 ), "__Quarter", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Quarters ), "__YearQuarter", [__Year] * 100 + [__Quarter] )
    VAR __Count = COUNTROWS( FILTER( __Table, [__YearQuarter] &amp;lt;= YEAR( __MaxDate ) * 100 + QUARTER( __MaxDate ) &amp;amp;&amp;amp; [__YearQuarter] &amp;gt;= YEAR( __MinDate ) * 100 + QUARTER( __MinDate ) ) )
    VAR __RollingQuartersTable = 
        ADDCOLUMNS(
            GENERATESERIES( 1, __Count, 1 ),
            "__Date", 
                VAR __EOM = EOMONTH( __Date1, 3 * [Value] * __Multiplier * -1  )
                VAR __Result = DATE( YEAR( __EOM ), MONTH( __EOM ), DAY( __Date1 ) )
            RETURN
                __Result
        )
    VAR __Table1 = FILTER( __RollingQuartersTable, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult, ( __PreResult + 1 ) * __Multiplier )
RETURN
    __Result + 0&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Year = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Table = ADDCOLUMNS( __Years, "__Date", DATE( [__Year], MONTH( __Date1 ), DAY( __Date1 ) ) )
    VAR __Table1 = FILTER( __Table, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult - 1, __PreResult * __Multiplier )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Week = 
    VAR __Date1 = [Today]
    VAR __Date2 = MAX([Purchase Date])
    VAR __MinDate = MIN( __Date1, __Date2 )
    VAR __MaxDate = MAX( __Date1, __Date2 )
    VAR __Multiplier = IF( __Date1 &amp;lt; __Date2, -1, 1 )
    VAR __Years = SELECTCOLUMNS( GENERATESERIES( YEAR( __MinDate ), YEAR( __MaxDate ), 1 ), "__Year", [Value] )
    VAR __Weeks = SELECTCOLUMNS( GENERATESERIES( 1, 53, 1 ), "__Week", [Value] )
    VAR __Table = ADDCOLUMNS( CROSSJOIN( __Years, __Weeks ), "__YearQuarter", [__Year] * 100 + [__Week] )
    VAR __Count = COUNTROWS( FILTER( __Table, [__YearQuarter] &amp;lt;= YEAR( __MaxDate ) * 100 + WEEKNUM( __MaxDate ) &amp;amp;&amp;amp; [__YearQuarter] &amp;gt;= YEAR( __MinDate ) * 100 + WEEKNUM( __MinDate ) ) )
    VAR __RollingWeeksTable = 
        ADDCOLUMNS(
            GENERATESERIES( 1, __Count, 1 ),
            "__Date", __Date1 + 7 * [Value] * __Multiplier * -1
        )
    VAR __Table1 = FILTER( __RollingWeeksTable, [__Date] &amp;gt;= __MinDate &amp;amp;&amp;amp; [__Date] &amp;lt;= __MaxDate )
    VAR __PreResult = COUNTROWS( __Table1 )
    VAR __Result = IF( __Multiplier &amp;gt; 0, __PreResult, ( __PreResult + 1 ) * __Multiplier )
RETURN
    __Result + 0&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Day = TRUNC( ( [Today] - MAX( 'Table'[Purchase Date] ) ) * 1 )&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Hour = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Hours = __Base * 24
    VAR __Result = IF( __Hours &amp;gt; 0, ROUNDUP( __Hours, 0), TRUNC( __Hours ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Minute = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Minutes = __Base * 24 * 60
    VAR __Result = IF( __Minutes &amp;gt; 0, ROUNDUP( __Minutes, 0), TRUNC( __Minutes ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;ToHellWithDATEDIFF Second = 
    VAR __Base = ( [Today] - MAX( 'Table2'[Purchase Date Time] ) ) * 1.
    VAR __Seconds = __Base * 24 * 60 * 60
    VAR __Result = IF( __Seconds &amp;gt; 0, ROUNDUP( __Seconds, 0), TRUNC( __Seconds ) )
RETURN
    __Result&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Learn more here in these videos:&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/xE0FfRmLUOI" data-video-remote-vid="https://youtu.be/xE0FfRmLUOI" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FxE0FfRmLUOI%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DxE0FfRmLUOI&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FxE0FfRmLUOI%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div data-video-id="https://youtu.be/iJ_gLzm14H0" data-video-remote-vid="https://youtu.be/iJ_gLzm14H0" class="lia-video-container lia-media-is-center lia-media-size-medium"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FiJ_gLzm14H0%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DiJ_gLzm14H0&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FiJ_gLzm14H0%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="reportid hidden"&gt;eyJrIjoiNTcwZTVmMjMtNTFjYS00ZjM1LWI0YTEtOTBlZTYxOGU5Njk4IiwidCI6Ijg3NDlmOWI5LWYzMmQtNDdhMS1hMjI0LTM2OTQxOGFlMmY1MSJ9&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Jun 2024 19:23:49 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Quick-Measures-Gallery/Rolling-DATEDIFF/m-p/3984344#M1099</guid>
      <dc:creator>Greg_Deckler</dc:creator>
      <dc:date>2024-06-10T19:23:49Z</dc:date>
    </item>
  </channel>
</rss>

