Запрос аналитики потока Azure для преобразования поля даты и времени в отдельное поле даты и времени - PullRequest
0 голосов
/ 22 октября 2019

Вот мое поле даты и времени: system.timestamp со значением 2019-10-22T08:00:22.4994430Z

Я ищу запрос в Azure Stream Analytics для преобразования даты и времени из одного поля (system.timestamp) в 2 поля (NewDate и NewTime).

NewDate станет 2019-10-22, NewTime станет 08: 00

Я пробовал много запросов, но ни один из них не работает, как ожидалось, ближайший был:

SELECT DATETIMEFROMPARTS(DATEPART(year,[EventEnqueuedUtcTime]),DATEPART(month,[EventEnqueuedUtcTime]),DATEPART(day,[EventEnqueuedUtcTime]),00,00,00,00) AS newdate

Но результат равен 2019-10-22T00:00:00.0000000Z

Время все еще с 0 и оно не пошло дальше для времени

SELECT
    DATETIMEFROMPARTS(DATEPART(year,[EventEnqueuedUtcTime]),DATEPART(month,[EventEnqueuedUtcTime]),DATEPART(day,[EventEnqueuedUtcTime]),00,00,00,00)
AS newdate
INTO
    table1
FROM
    esp32

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Azure Stream Analytics знает только тип данных DateTime (включая дату и время): https://docs.microsoft.com/en-us/stream-analytics-query/data-types-azure-stream-analytics

Однако вы можете использовать функцию DATEPART() для достижения желаемого: https://docs.microsoft.com/en-us/stream-analytics-query/datepart-azure-stream-analytics

Вы можете использовать различные версии DATEPART() и создавать результаты в виде строк.

0 голосов
/ 22 октября 2019

Может быть, попытаться преобразовать его в NVarChar. Ниже приведен пример того, как вы можете сделать это в следующем формате гггг-мм-дд:

SELECT
Concat(DateName(yyyy, SourceTimestamp),'-',
CAST(CASE 
              WHEN LEN(CAST(DATEPART(mm,SourceTimestamp) AS NVARCHAR(MAX))) > 1
                 THEN CAST(DATEPART(mm,SourceTimestamp) AS NVARCHAR(MAX))
              ELSE Concat('0', CAST(DATEPART(mm,SourceTimestamp) AS NVARCHAR(MAX)))
        END AS NVARCHAR(MAX)),
'-',
CAST(CASE 
              WHEN LEN(CAST(DATEPART(dd,SourceTimestamp) AS NVARCHAR(MAX))) > 1
                 THEN CAST(DATEPART(dd,SourceTimestamp) AS NVARCHAR(MAX))
              ELSE Concat('0', CAST(DATEPART(dd,SourceTimestamp) AS NVARCHAR(MAX)))
        END AS NVARCHAR(MAX))) as NewDate

INTO
    table1
FROM
    esp32

Аналогичный пример, который вы можете применить, чтобы получить дату в формате чч: мм.

Обновление

Вы можете добавить функцию UDF в качестве другого альтернативного решения, которое будет возвращать значение в нужном формате. Например, ваш NewDate UDF будет выглядеть (и возвращает строку):

// Sample UDF which returns sum of two values.
function main(arg1) {
   'use strict';
   var date = new Date(arg1);
   var yearString = date.getFullYear().toString();
   var month = date.getMonth() + 1;
   var day = date.getDate();
   var monthString = month < 10 ? "0" + month.toString() : month.toString();
   var dayString = day < 10 ? "0" + day.toString() : day.toString();

   return yearString + '-' + monthString + '-' + dayString;
}

И запрос, который использует эту функцию:

Для времени - функция NewTime:

function main(arg1) {
   'use strict';
   var date = new Date(arg1);
   var hour = date.getHours();
   var minutes = date.getMinutes();
   var hoursString = hour < 10 ? "0" + hour.toString() : hour.toString();
   var minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString();

   return hoursString + ":" + minutesString;
}

И запрос:

SELECT UDF.NewDate(system.Timestamp), UDF.NewTime(system.Timestamp)
INTO table1
FROM esp32
...