当前位置: 首页 > 面试题库 >

Presto SQL:使用由于查询而来的时区字符串更改时区不起作用

公良扬
2023-03-14
问题内容

我正在通过Mode Analytics Platform连接到AWS Athena,并使用其查询引擎(基于Presto
0.172)查询表。该表public.zones将时区信息存储在称为time_zone我感兴趣的某些区域的列中,存储为varchar

例如,如果我输入:

SELECT time_zone 
FROM public.zones
LIMIT 4;

我得到(如预期):

time_zone
----------  
US/Pacific 
US/Eastern 
US/Eastern 
US/Eastern

我可以运行以下测试查询:

SELECT 
  timestamp '2017-06-01 12:34:56.789' AT TIME ZONE 'US/Eastern' AS time_eastern,
  time_zone 
FROM public.zones
LIMIT 4;

我得到(如预期)

time_eastern                        time_zone
----------------------------------  ----------
2017-06-01 08:34:56.789 US/Eastern  US/Pacific
2017-06-01 08:34:56.789 US/Eastern  US/Eastern
2017-06-01 08:34:56.789 US/Eastern  US/Eastern
2017-06-01 08:34:56.789 US/Eastern  US/Eastern

现在,我想'2017-06-01 12:34:56.789'在从时区表中查询的不同时区中代表相同的时间字符串。我希望以下查询能够运行。(它在PostgreSQL上运行)。

SELECT 
  timestamp '2017-06-01 12:34:56.789' AT TIME ZONE time_zone AS time_custom,
  time_zone 
FROM public.zones
LIMIT 4;

我收到以下错误:

[Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. 
line 2:52: no viable alternative at input 'TIME ZONE time_zone'

这是为什么在Presto SQL / AWS Athena查询引擎中不起作用的原因是什么?

谁能建议任何解决方法,或者我的语法错误是什么?


问题答案:

AT TIME ZONE 仅接受文字或间隔。

with_timezone为此,Presto
320会添加(用于timestamp值)at_timezone(用于timestamp with time zone值)。

如果您使用的是Presto的旧版本(例如撰写本文时的Athena),则可以使用以下解决方法。您可以将时间戳记值转换为varchar,与zone串联并转换为timestamp with time zone

presto> select cast(cast(t as varchar) || ' ' || zone as timestamp with time zone)
  from (values (timestamp '2017-06-01 12:34:56.789', 'US/Pacific')) x(t, zone);
                    _col0
---------------------------------------------
 2017-06-01 12:34:56.789 America/Los_Angeles
(1 row)

(注意:已在Presto 320上进行了测试。如果该功能尚不能在Athena上使用,请告诉我。)



 类似资料:
  • 我试图找到一个解决方案,如何将存储在数据库中的日期时间转换为yyyyy-mm-dd HH-mm-ss,并给它时区美国/Los_Angeles。 如果我更改时区,Carbon将自动从时间中减去7小时,这就是将时间从UTC更改为PST时发生的情况,但我的DB中的时间设置为PST时间。例如,我希望时间是今天上午10点,但如果我改变时区,碳将转换为今天凌晨3点。 如果时区改为PST,但仍然保持上午10点的

  • 这是波莉适合的场景吗?或者从设计的角度来看,在业务逻辑中处理这个是干净的方式吗?然后我需要包装这个逻辑以避免重复我自己。

  • 数据库: SQL查询 搜索 当我使用“Like”查询时,一切都正常,但是当我查找John时,它会显示John和Johnson的两个结果,因为它们是相似的。但当我搜索约翰时,它必须只显示约翰(而不是约翰逊)的结果。 到目前为止,我试过: 但它不起作用LogCat: 请给我一个提示。

  • 我有一个本地日期时间的字符串表示和一个Java时区。 我正在尝试以 MM/dd/yyyy HH:mm:ssZ 格式获取输出,但我无法弄清楚如何使用正确的日期时间和时区创建日历或 JodaTime 对象。如何将时区转换为可以通过简单日期格式“Z”或“z”解析的值? 和 返回 这是 。 是创建日历或Joda日期时间并通过解析字符串“08/14/2014 15:00:00”来设置各个年/月/日/小时/分

  • 当我通过jdbc执行查询时,选择sysdate;我得到了正确的时间戳,在UTC中具有正确的值,但不幸的是这个值的时区是+2。 例如:服务器有,但我得到了。 之后,我通过jackson将时间戳映射到json并向客户端发送响应,客户端得到了不正确的值2019-06-26T16:10:13.000+0000。 我无法更改应用程序和映射器的时区。 我该如何解决这个问题?

  • 问题内容: 我有一个网页,其中有三个下拉菜单,分别是日,月和年。如果我使用带数字的JavaScript 构造函数,那么我会得到一个当前时区的对象: 输入正确的日期,但由于夏令时,它认为该日期为GMT + 01:00。 这里的问题是,我随后将其传递给Ajax方法,并且在服务器上反序列化日期时,日期已转换为GMT,因此浪费了一个小时,使一天倒退了一个小时。现在,我可以将日期,月份和年份分别传递给Aja