2016-12-29 58 views
-1

如何生成幾年之間的所有日期列表?生成日期列表的函數

通過按日期篩選此類表格並應用每日(每月)折舊來計算每天或每月或每年的折舊所需的數據。

回答

0

我創建了一個函數來生成這樣一個表。它將開始和結束年份作爲參數。

您可以將其作爲單獨的查詢並稍後調用,或者將其完全包含在查詢中。

let 
    GenerateDates = (StartYear as number, EndYear as number) => 

    let 
     //Generate a list of years 
     Yrs = #table(type table [J = Int64.Type, Yr = Int64.Type], List.Transform({StartYear..EndYear}, each {1, _})), 
     //Generate a list of months 
     Mnths = #table(type table [J = Int64.Type, Mn = Int64.Type], List.Transform({1..12}, each {1, _})), 
     //Generate a list of days 
     Days = #table(type table [J = Int64.Type, D = Int64.Type], List.Transform({1..31}, each {1, _})), 
     //Join all these tables 
     Join1 = Table.Join(Yrs, "J", Mnths, "J", JoinKind.Inner), 
     Join2 = Table.Join(Join1, "J", Days, "J", JoinKind.Inner), 
     // Add column with date, using try..otherwise to evade errors for non-existing dates, such as 31 april. :) 
     AddDate = Table.AddColumn(Join2, "Date", each try #date([Yr], [Mn], [D]) otherwise null, type date), 
     //Get rid of nulls 
     FilterNulls = Table.SelectRows(AddDate, each [Date] <> null), 
     //Return result 
     Result = Table.SelectColumns(FilterNulls, {"Date"}) 
    in 
     Result 
in 
    GenerateDates 

更新

儘管MarcelBeug建議使用List.Dates更容易(我錯過了:)),下面是使用type table可能有用的一些示例。

1

您可以使用List.Dates(以日期開始,以數字計數,以持續時間爲步數)。

如List.Dates(#date(2016,1,1),366#持續時間(1,0,0,0))爲您提供2016年

+0

是的,我已經錯過了這一切日期函數,:(它確實更容易,你只需要使用過濾器或其他方式來檢測閏年。想想寫這個是在與SQL Server上的類似任務混淆之後發生的。 – Eugene