Как преобразовать четырехзначный юлианский (yddd) в григорианский (мм / дд / гг и т. Д.) В загрузчике скриптов? - PullRequest
0 голосов
/ 10 октября 2019

Цель

Чтобы скрипт данных обрабатывал логику и преобразование в формат даты, который можно анализировать / читать с помощью линейного графика QlikSense / QlikView. Ака это должен быть нормальный формат. (ГГГГММДД, ММ / ДД / ГГ и т. Д.)

Контекст

  • Все относящиеся к дате таблицы находятся в одной таблице.
  • Поле данных датыis in называется «date», и на него успешно ссылаются в Qliksheets, используя [Date]
  • ddd - День года. y - последняя цифра года. Предполагается, что это десятилетие - 2010-е, поэтому мы можем смело добавлять «201» перед цифрой, давая вам год.

    Примеры четырехзначного Юлиана: 9001 - это 1 января 2019 . 9283 - 10 октября 2019 года

Что я уже пробовал

Я шел по пути простого добавления "201 "перед первой цифрой предоставленного четырехзначного числа, а затем вычисляя последние / следующие три цифры четырехзначного числа.

В настоящее время я даже не дошел до расчетной части, так какЯ даже не могу заставить конкатенацию строк работать. Все мои попытки распространялись вокруг:

[AwesomeSheet]:
LOAD
  Right([Date], 3) as JulianDay,                         // Get day
  Left([Date], 1) as JulianYearSingleDigit,              // Get year
  201 & JulianYearSingleDigit & JulianDay as TempField   // Attempt to concatenate the numbers
  // Here be the JulianDay calculation
  Date#([TempField], 'YYYYMMDD') as FormattedDate        // Format into readable format for line graph
FROM [my-awesome-file.csv];

Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Возможным решением является получение даты начала года, добавление к ней количества дней и преобразование в дату:

date( 
  date#( '201' & left([Date], 1)  & '0101', 'YYYYMMDD') 
  -1 
  + num( mid([Date], 2,4) ) 
)

Что делает расчет:

  • получениепервый символ даты left([Date], 1)
  • добавляет 201, чтобы отформатировать его как номер года '201' & left([Date], 1)
  • добавляет 0101 к нему '201' & left([Date], 1) & '0101'

(на данный момент эта часть будет равна 20190101 (как строка))

  • date#( '201' & left([Date], 1) & '0101', 'YYYYMMDD') - это "скажет" Qlik, что строка внутри является датой в формате YYYYMMDD
  • к началу года мы добавим дни (последние 3 символа из исходной строки) num( mid([Date], 2,4) )
  • приведем все к дате

Какрезультат 9283 = 10/10/2019

Итак, ваш скрипт будет выглядеть так:

[AwesomeSheet]:
LOAD
date( 
 date#('201' & left([Date], 1)  & '0101', 'YYYYMMDD') 
 -1 
 + num( mid([Date], 2,4) ) 
) as FormattedDate
FROM [my-awesome-file.csv];

Это один из возможных способов. Там может быть короче / проще, но это на моей голове

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

Похоже, вам нужен конвертер dayOfYearToYmd - это может помочь «Преобразование дня в дату в SQL Server»

Такжесправка относительно понятия юлианские даты:

https://en.wikipedia.org/wiki/Julian_day

http://www.fourmilab.ch/documents/calendar/

юлианские дни просто перечисляют дни и дроби, которыес начала юлианской эры, которая определяется как начало в полдень в понедельник, 1 января года 4713 г. до н.э. в юлианском календаре.

, т. е. любая дата до отчетной даты имеетотрицательное значение, все после является положительным, что не соответствует вашему сообщению.

Учитывая вышеизложенное, вы можете объявить начало каждого календарного года в качестве контрольной даты. :)

...