Преобразование даты с использованием Hive или sql - PullRequest
0 голосов
/ 09 апреля 2020

Предпосылка: у вас есть таблица с одним столбцом, original_date, со строкой типа данных:

ORIGINAL_DATE  
20190825 
20190826 
20190827 
20190828 
20190829 
20190830 
20190831 
20190901 

Вопрос: Напишите запрос SQL для вычисления еще двух столбцов - end_of_week - дата следующего воскресенья с original_date. Если original_date уже является воскресным днем, это поле должно иметь то же значение end_of_month - значение даты конца месяца. Приемлемым решением является любое действительное число в строковом формате original_date. С вычислением end_of_month и end_of_week

ORIGINAL_DATE    END_OF_WEEK     END_OF_MONTH  
20190825    20190825    20190831 
20190826    20190901    20190831 
20190827    20190901    20190831 
20190828    20190901    20190831 
20190829    20190901    20190831 
20190830    20190901    20190831 
20190831    20190901    20190831 
20190901    20190901    20190930 

Дополнительная информация:

20190825 - воскресенье, поэтому end_of_week для этого значения остается той же датой.

20190827 - вторник, а следующее воскресенье - 20190901

CREATE TABLE random_dates ( original_date VARCHAR(8) NOT NULL  ); 

INSERT INTO random_dates(original_date) values('20190825'); 
INSERT INTO random_dates(original_date) values('20190826'); 
INSERT INTO random_dates(original_date) values('20190827'); 
INSERT INTO random_dates(original_date) values('20190828'); 
INSERT INTO random_dates(original_date) values('20190829'); 
INSERT INTO random_dates(original_date) values('20190830'); 
INSERT INTO random_dates(original_date) values('20190831'); 
INSERT INTO random_dates(original_date) values('20190901');

ОЖИДАЕМЫЙ ВЫХОД:

20190825    2019-08-25  2019-08-31 
 20190826   2019-09-01  2019-08-31 
 20190827   2019-09-01  2019-08-31 
 20190828   2019-09-01  2019-08-31 
 20190829   2019-09-01  2019-08-31 
 20190830   2019-09-01  2019-08-31 
 20190831   2019-09-01  2019-08-31
 20190901   2019-09-01  2019-09-30

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Решение для Hive:

with random_dates as (--this is your example dataset
select stack(8,
'20190825', '20190826', '20190827', '20190828', '20190829', '20190830', '20190831', '20190901'
) as original_date
)

select original_date,
       date_add(date_formatted, 6-days)  end_of_week,
       last_day(date_formatted)          end_of_month
  from       
      (
       select original_date, 
              regexp_replace(original_date,'^(\\d{4})(\\d{2})(\\d{2})$','$1-$2-$3') date_formatted,
              pmod(datediff(regexp_replace(original_date,'^(\\d{4})(\\d{2})(\\d{2})$','$1-$2-$3'),'1900-01-08'),7) days
         from random_dates
      )s
;

Результат:

original_date   end_of_week end_of_month
20190825    2019-08-25  2019-08-31
20190826    2019-09-01  2019-08-31
20190827    2019-09-01  2019-08-31
20190828    2019-09-01  2019-08-31
20190829    2019-09-01  2019-08-31
20190830    2019-09-01  2019-08-31
20190831    2019-09-01  2019-08-31
20190901    2019-09-01  2019-09-30
0 голосов
/ 09 апреля 2020
SELECT original_date,
CASE  DAYOFWEEK(STR_TO_DATE(original_date,'%Y%m%d'))
WHEN 1 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 0 DAY)
WHEN 2 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 6 DAY)
WHEN 3 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 5 DAY)
WHEN 4 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 4 DAY)
WHEN 5 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 3 DAY)
WHEN 6 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 2 DAY)
WHEN 7 THEN  DATE_ADD(STR_TO_DATE(original_date,'%Y%m%d'),INTERVAL 1 DAY)
END AS END_OF_WEEK,
LAST_DAY(STR_TO_DATE(original_date,'%Y%m%d')) AS END_OF_MONTH
FROM random_dates;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...