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

Mic*_*ael 5 azure-data-factory azure-data-factory-2

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

代替下面表达式中的“dd”,应该自动是当月的最后一天(28、30 或 31):

@{formatDateTime(adddays(utcnow(),-2), 'yyyy-MM-ddT23:59:59.999')}
Run Code Online (Sandbox Code Playgroud)

考虑到它实际上是八月,我期望表达式中的以下结果: “2019-08-31T23:59:59.999”

Som*_*Guy 5

    @adddays(startOfMonth(addToTime(utcnow(), 1, 'Month')), - 1, 'yyyy-MM-dd')
Run Code Online (Sandbox Code Playgroud)

更多在这里:

Azure 数据工厂 - 字符串、日期等的表达式


wBo*_*Bob 3

我建议最简单的方法是将日期及其各自的月末日期存储在表或文件中(例如在数据湖或 Blob 存储中),然后仅使用查找任务来获取日期。这将是最容易维护和调试的。

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

SELECT EOMONTH ( GETDATE() )
Run Code Online (Sandbox Code Playgroud)

那有多容易呢?如果您使用 Databricks,这里有一个简单的示例。

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

@addDays(formatDateTime(addDays(formatDateTime(variables('inputDate'), 'yyyy-MM-28'),5), 'yyyy-MM-01T23:59:59.999'),-1)
Run Code Online (Sandbox Code Playgroud)

这种更简单的方法(请参阅对旧的更复杂版本的编辑)人为地将日期设置为 28,然后添加 5 天(这总是让您进入下个月),然后将日期重置为 1,然后休息 1 天。

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

我建议使用变量(例如variables('inputDate')),这样您就可以测试它,但您可以在完成测试后替换variables('inputDate')为。utcnow()