Redshift - ошибка при преобразовании времени UTC в местное время в предложении where - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть некоторые данные о продажах, которые записаны в UTC.Я пытаюсь преобразовать его в местный часовой пояс, в котором произошли продажи.

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

select fs.sale_id,fs.store_type,fs.sale_time ,
case when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time ) when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time ) when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) else null end, fs.timezone as new_time
from sales fs
where to_char((case when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time ) when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time ) when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) else null end, fs.timezone),'yyyy-mm-dd') = '2018-09-01'

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

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Я бы предложил использовать функцию 'CONVERT_TIMEZONE', подробности перечислены ниже:

https://docs.aws.amazon.com/redshift/latest/dg/CONVERT_TIMEZONE.html

Например, ваш простой запрос для преобразования продаж из UTC в EST будет чем-токак показано ниже.

select listtime, convert_timezone('PST', listtime) from listing where listid = 16;

Будет возвращено что-то вроде ниже.

 listtime       |   convert_timezone
 --------------------+-------------------
2008-08-24 09:36:12     2008-08-24 01:36:12 
0 голосов
/ 28 сентября 2018

Пожалуйста, попробуйте это

select fs.sale_id,fs.store_type,fs.sale_time ,
case 
when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) 
when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) 
when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time )
when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time )
when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) 
else null end, fs.timezone as new_time
from sales fs
where to_char( (
case
when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) 
when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) 
when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time ) 
when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) 
else null end),'yyyy-mm-dd') = '2018-09-01'

Я думаю, что проблема с копией вставки, когда у вас был лишний ", fs.timezone".

И я тоже думаю, что это плохой запрос.Убить, если таблица большая с такой большой функцией в предложении where.

0 голосов
/ 28 сентября 2018

Попробуйте ниже: у вас синтаксическая ошибка

select fs.sale_id,fs.store_type,fs.sale_time ,
case when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) 
when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) 
when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time ) 
when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) else null end, fs.timezone as new_time
from sales fs
where to_char(
case when fs.timezone = 'BST' then dateadd( h, 1, fs.sale_time ) 
when fs.timezone = 'EDT' then dateadd( h,- 4, fs.sale_time ) 
when fs.timezone = 'CEST' then dateadd( h, 2, fs.sale_time ) 
when fs.timezone = 'EEST' then dateadd( h, 3, fs.sale_time )
when fs.timezone = 'MSK' then dateadd( h, 3, fs.sale_time ) 
when fs.timezone = 'WEST' then dateadd( h, 1, fs.sale_time ) else null end,
'yyyy-mm-dd') = '2018-09-01'
...