Redshift - 在 where 子句中将 UTC 时间转换为本地时间时出错
Redshift - Error when converting UTC time to local time in where clause
我有一些以 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'
任何人都可以建议我如何修改此查询。我正在使用红移数据库。谢谢
试试下面:你有语法错误
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'
我建议使用'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;
它将 return 如下所示。
listtime | convert_timezone
--------------------+-------------------
2008-08-24 09:36:12 2008-08-24 01:36:12
请试试这个
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”。
而且我也认为这是错误的查询。如果table很大,在where子句中有这么大的功能,我会杀了。
我有一些以 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'
任何人都可以建议我如何修改此查询。我正在使用红移数据库。谢谢
试试下面:你有语法错误
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'
我建议使用'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;
它将 return 如下所示。
listtime | convert_timezone
--------------------+-------------------
2008-08-24 09:36:12 2008-08-24 01:36:12
请试试这个
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”。
而且我也认为这是错误的查询。如果table很大,在where子句中有这么大的功能,我会杀了。