如何在 ADF2 的动态内容中获取一个月的最后一天?

How can I get the last day of a month in dynamic content in ADF2?

我想根据 utcnow() 时间戳获取一个月的最后一天。

代替下面表达式中的 "dd" 应该自动有该月的最后一天(28、30 或 31):

@{formatDateTime(adddays(utcnow(),-2), 'yyyy-MM-ddT23:59:59.999')}

考虑到实际上是八月,我希望表达式的结果如下: "2019-08-31T23:59:59.999"

我建议最简单的方法是将日期和它们各自的月末日期存储在 table 或文件中(例如在 Data Lake 或 Blob Store 中),然后只使用查找任务获取日期。这将是最容易维护和调试的。

如果您的管道中有一些计算,为什么不将其传递到无疑更容易的地方。例如,如果您有一个 SQL 数据库,请存储一个带有预先计算的月末日期列的日历 table。然后就像进行查找一样简单。 SQL Server 和 Azure SQL DB 甚至有一个内置函数,因此您不必自己编写:

SELECT EOMONTH ( GETDATE() )

这有多容易?如果您使用的是 Databricks,则有一个简单的示例 .

如果您绝对必须使用内置函数和表达式在数据工厂中进行内联,那么这在技术上是可行的,但我会先通过测试来做一些:

@adddays(formatDateTime(adddays(formatDateTime(variables('inputDate'), 'yyyy-MM-28'),5), 'yyyy-MM-01T23:59:59.999'),-1)

这种更简单的方法(请参阅更早更复杂版本的编辑)人为地将日期设置为 28,然后添加 5 天(这总是让您在下个月登陆),然后将日期重置为 1,然后需要 1 天关闭。

已成功测试了 2000 年 1 月 1 日至 2040 年 12 月 31 日的日期。

我建议使用变量(例如 variables('inputDate') )以便您可以对其进行测试,但您可以在完成测试后将 variables('inputDate') 替换为 utcnow()

    @adddays(startOfMonth(addToTime(utcnow(), 1, 'Month')), - 1, 'yyyy-MM-dd')

更多信息:

Azure Data Factory - Expressions for Strings, Dates and More