问题描述
在 Azure Synapse / Datafactory 管道期间,我尝试“简单地”将日期时间保存为 CSV 文件中的字符串。在保存日期时间之前,我想对其进行格式化,例如“2021-04-13T00:00:00.000Z”,其中“T”之后总是“00:00:00.000Z”。
在复制活动中,我使用 Azure 中的 formatDateTime 函数在源中添加一个新字段并格式化日期时间,但我无法产生我期望的结果。此外,我遇到了多个我不明白的输出。
这是我为调试所做的工作: 在复制活动“Source”中,我添加了多个新字段,这些字段以不同的方式对 PipelineTriggerTime 进行格式化并产生不同的效果。我将这些值作为接收器写入 CSV 文件。
下表显示了输入、动态值、预期结果和实际结果。
pipeline().TriggerTime | 动态内容 | 预期输出 | 实际输出 | |
---|---|---|---|---|
1 | 2021-04-13T11:14:33.375Z | @formatDateTime(pipeline().TriggerTime,'yyyy-MM-ddT00:00:00.000Z') | 2021-04-13T00:00:00.000Z | 04/13/2021 00:00:00 |
2 | 2021-04-13T11:14:33.375Z | @formatDateTime(pipeline().TriggerTime,'yyyy-MM-dd hh:mm:ss') | 2021-04-13 11:14:33 | 2021-04-13 11:14:33 |
3 | 2021-04-13T11:14:33.375Z | @formatDateTime(pipeline().TriggerTime,'yyyy-MM-ddTsomeText') | 2021-04-13TsomeText | 2021-04-13T33o14eTexA |
4 | 2021-04-13T11:14:33.375Z | @concat(formatDateTime(pipeline().TriggerTime,'yyyy-MM-dd'),'T00:00:00.000Z') | 2021-04-13T00:00:00.000Z | 04/13/2021 00:00:00 |
5 | 2021-04-13T11:14:33.375Z | @concat(formatDateTime(pipeline().TriggerTime,'TsomeText') | 2021-04-13TsomeText | 2021-04-13TsomeText |
老实说,对我来说唯一不令人惊讶的输出是 2 和 5。
这可以解释吗? formatDateTime 函数应该返回一个“字符串”,但它似乎做了一些不同的事情(有时)..
任何其他想法,我如何才能实现我的目标,将字符串“2021-04-13T00:00:00.000Z”保存到 Azure 复制活动中的 csv 文件?
我使用的是 Synapse Analytics,但数据工厂的效果相同,因此我添加了后者以覆盖更多人。
解决方法
我是否建议使用 startOfDay() 函数而不是 formatDateTime()。
至于对结果的解释,这很复杂。看看 ISO 8601 标准,我在下面粘贴了一个链接。时区会影响转换/格式。如果您坚持保留 formatDateTime() 函数或由于某种原因 startOfDay 不适合您,我会尝试一些方法。
记录 #1) 删除格式参数末尾的 Z。 - 我很好奇这是否能解决这个问题(注意 Z 没有被带入记录 #2 并且你没有在该函数参数中包含 Z?)
记录 #3) 您不能在 'yyyy-MM-dd' 的末尾添加其他文本 - 这就是我建议您查看 ISO 8601 标准的原因,因为这是 formatDateTime() 和 startOfDay() 都支持的原因.
记录 #4) 再次删除 Z,就像在 #1 中一样。但是,如果它不起作用,我还有另一个想法。可能是操作顺序与我们预期的略有不同。也许 formatDateTime() 以您想要的方式对其进行格式化,然后由于某种原因,连接函数将其更改为 mm/dd/yyyy 格式,然后再将其与您要添加的 0 连接起来。我不确定它为什么会这样做,但我不确定它还会是什么,所以如果它不是 Z 并且不是这个,那么我和你一样迷失在这个。
最后要注意的是,如果要添加毫秒,则需要在时间的秒数后添加一个小数。所以你的格式是 hh:mm:ss.sss
祝你好运!