Azure 流分析查询:将字符串转换为 DateTime

Posted

技术标签:

【中文标题】Azure 流分析查询:将字符串转换为 DateTime【英文标题】:Azure Stream Analytics Query: Cast string to DateTime 【发布时间】:2018-01-24 05:57:57 【问题描述】:

流解析的输入是IoT hub,它会收到JSON这样的消息。

数据

[
   
      "deviceId": "testing",
      "id": "b8db8f582c474225b90b75dfed2e9c63",
      "username": "testing",
      "localtime": "24/01/2018 11:31:24",
      "b": 240,
      "e": 357,
      "AC": 0,
      "FM": 0,
      "UC": 0,
      "DL": 0,
      "DS": 0,
      "DP": 0,
      "DR": 0,
      "LB": 120,
      "ASTV": 73,
      "MSTV": 0.5,
      "ALTV": 43
   
]

Azure Stream Analytics 查询中,我使用CAST 函数将本地时间从字符串转换为日期时间,但它失败了。不允许使用CONVERT 功能。

SELECT
    id as id,
    deviceId as deviceId,
    username as username,
    cast(localtime as datetime) as localtime,
    AC as AC, FM as FM, UC as UC, 
    DL as DL, DS as DS, DP as DP,
    LB as LB, ASTV as ASTV, MSTV as MSTV
FROM
    iot

无法将值“24/01/2018 12:58:23”转换为表达式“cast (localtime as datetime)”中的类型“datetime”

【问题讨论】:

你在尝试我更新的答案吗?有什么问题,写在cmets。 试试我更新的答案,希望它现在可以工作...... SUBSTRING 是受支持的 function 【参考方案1】:

使用STRING FUNCTIONS,我们可以实现:

Azure 流分析支持SUBSTRING 函数。

SELECT
    id as id,
    deviceId as deviceId,
    username as username,
    CAST(SUBSTRING(localTime ,7 ,4)+'/'+SUBSTRING(localTime ,4 ,2)+'/'+SUBSTRING(localTime ,1 ,2)+SUBSTRING(localTime ,11 ,9) AS DATETIME) as localtime,
    AC as AC, FM as FM, UC as UC, 
    DL as DL, DS as DS, DP as DP,
    LB as LB, ASTV as ASTV, MSTV as MSTV
FROM
    iot;

希望这会有所帮助。

示例:

DECLARE @localTime VARCHAR(20)='24/01/2018 11:31:24'

SELECT CAST(SUBSTRING(@localTime ,7 ,4)+'/'+SUBSTRING(@localTime ,4 ,2)+'/'+SUBSTRING(@localTime ,1 ,2)+SUBSTRING(@localTime ,11 ,9) AS DATETIME)

结果:

2018-01-24 11:31:24.000

【讨论】:

流分析查询中不允许使用转换函数。流分析查询语言只是 tsql 的一个子集。 msdn.microsoft.com/en-us/library/azure/… @SamTew,你试试这个吗? 对不起,因为我正忙于其他事情,所以迟到了。再次,有一个错误。 i.stack.imgur.com/XKQ3F.png 我认为错误不在于SUBSTRING 函数,而是因为您的数据类型的nvarchar(max)。您能否将数据类型更改为NVARCHAR(100) 或其他内容,然后试试这个。希望能给你带来结果。【参考方案2】:

问题可能是 localtime "24/01/2018 12:58:23" 具有 DD/MM/YYYY 格式,并且您的作业使用需要 MM/DD/YYYY 的语言环境,所以问题在于没有 24 个月。

您可以更改工作的语言环境或使用javascript function 来解析具有特定语言环境的日期时间。

【讨论】:

以上是关于Azure 流分析查询:将字符串转换为 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure 流分析查询创建复杂类型

Azure 流分析将行转换为列

Unix 时间在 Azure 流分析中转换为日期

Azure 流分析 CreateOrReplace 转换冲突或错误请求

Azure 流分析作业 - 转换查询 - ARM 模板中的正确格式

如何将 Azure 流分析中的“类字典”结构转换为带有 javascript UDF 的多维数组?