Redshift-在where子句中将UTC时间转换为本地时间时出错

时间:2018-09-28 05:27:46

标签: sql amazon-redshift timestamp-with-timezone

我有一些以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'

任何人都可以建议我如何修改此查询。我正在使用redshift DB。谢谢。

3 个答案:

答案 0 :(得分:2)

我建议使用“ 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 

答案 1 :(得分:1)

尝试以下方法:您遇到语法错误

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'

答案 2 :(得分:1)

请尝试

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='city' value="123" />
<input type="button" id='btnChange' value="Change" onclick="add();return false;" />
<script>
  function add() {
    $("#city").val("abc");
  }
</script>

我认为您有多余的“,fs.timezone”的复制粘贴问题。

我也认为这是错误的查询。如果table大而在where子句中有这么大的功能,那将被杀死。