Sql 从时间戳中提取日期部分

Sql 从时间戳中提取日期部分,sql,amazon-redshift,Sql,Amazon Redshift,我试图从带有时区的时间戳中提取小时。然而,我的时间来错了 下面是一个示例,我正在使用Dbeaver并将时区设置为EST: SELECT '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo, EXTRACT(HOUR FROM foo) as ex, DATE_PART('HOUR', foo::timestamp) as dp SELECT current_setting('TIMEZONE'); 返回: foo

我试图从带有时区的时间戳中提取小时。然而,我的时间来错了

下面是一个示例,我正在使用Dbeaver并将时区设置为EST:

SELECT '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo,
EXTRACT(HOUR FROM foo) as ex,
DATE_PART('HOUR', foo::timestamp) as dp
SELECT current_setting('TIMEZONE');
返回:

foo                 |ex |dp
2020-01-24 17:27:12 |22 | 22
  • 为什么我的时间提前了3个小时,而应该晚了3个小时
  • Extract
    DATE\u部分
    似乎没有给我想要的时间。它看起来像是将17作为EST,然后将其转换为UTC。以下是我期望得到的:

它对我来说非常好(使用dbVisualizer)

问题在于您的SQL客户机

SQL客户机通常强制使用影响您看到的值的格式。您可以通过在将值发送到SQL客户端之前将其转换为文本来测试这一点:

选择
“2020-01-2414:27:12”在时区“美国/太平洋”作为foo,
foo::文本作为t,
提取(从foo开始的小时数)作为ex,
日期部分('HOUR',foo::timestamp)作为dp
对我来说,这会导致:

2020-01-24 22:27:12+00  2020-01-24 22:27:12+00  22.0    22.0

在您的SQL客户端中尝试一下,看看会发生什么。

它对我来说非常好(使用dbVisualizer)

问题在于您的SQL客户机

SQL客户机通常强制使用影响您看到的值的格式。您可以通过在将值发送到SQL客户端之前将其转换为文本来测试这一点:

选择
“2020-01-2414:27:12”在时区“美国/太平洋”作为foo,
foo::文本作为t,
提取(从foo开始的小时数)作为ex,
日期部分('HOUR',foo::timestamp)作为dp
对我来说,这会导致:

2020-01-24 22:27:12+00  2020-01-24 22:27:12+00  22.0    22.0

在您的SQL客户端中尝试,看看会发生什么。

检查您的时区是否设置为EST:

SELECT '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo,
EXTRACT(HOUR FROM foo) as ex,
DATE_PART('HOUR', foo::timestamp) as dp
SELECT current_setting('TIMEZONE');
或与:

show timezone;
如果不是,则可以如下设置:

set timezone to est;
如图所示

如果不起作用,请尝试使用
convert\u时区

select convert_timezone('US/Pacific', '2020-01-24 14:27:12')
在探索手头的材料时,我发现了这样一个事实:

注意:Amazon Redshift不验证POSIX样式的时区 规范,因此可以将时区设置为无效 价值例如,以下命令不返回错误, 即使它将时区设置为无效值

将时区设置为“xxx36”


从该来源:

检查您的时区是否设置为EST:

SELECT '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo,
EXTRACT(HOUR FROM foo) as ex,
DATE_PART('HOUR', foo::timestamp) as dp
SELECT current_setting('TIMEZONE');
或与:

show timezone;
如果不是,则可以如下设置:

set timezone to est;
如图所示

如果不起作用,请尝试使用
convert\u时区

select convert_timezone('US/Pacific', '2020-01-24 14:27:12')
在探索手头的材料时,我发现了这样一个事实:

注意:Amazon Redshift不验证POSIX样式的时区 规范,因此可以将时区设置为无效 价值例如,以下命令不返回错误, 即使它将时区设置为无效值

将时区设置为“xxx36”


来自此来源:

Hi@Jacky,请查看此链接和评论。谢谢另外,请给我们看一下您的完整代码好吗?或者这是您的完整代码??我的完整代码正在创建与所示相同的结果。我也在RStudio上试过,得到了同样的结果。我的数据库是一个亚马逊红移服务器。嗨@Jacky,再次检查链接…我已经马上编辑了它,但你点击它的速度非常快:)在你的问题中,PostgreSQL也被标记了?在PostgreSQL上一切正常:。。。如果您的标签与PostgreSQLHi@Jacky无关,请删除它,请查看此链接和评论。谢谢另外,请给我们看一下您的完整代码好吗?或者这是您的完整代码??我的完整代码正在创建与所示相同的结果。我也在RStudio上试过,得到了同样的结果。我的数据库是一个亚马逊红移服务器。嗨@Jacky,再次检查链接…我已经马上编辑了它,但你点击它的速度非常快:)在你的问题中,PostgreSQL也被标记了?在PostgreSQL上一切正常:。。。如果您的标记与PostgreSQLShow时区无关,则请删除该标记,该标记显示db是UTC格式的,但在示例中使用17:27:12作为foo,在datepart/extract中使用22作为查询仍然是完全不正确的。应该分别是06:27:12和6点。我不确定是什么导致了这个问题的发生,但你的笔记可能是一个原因。我确实试过美国/洛杉矶,但结果同样不正确。然而,这确实有效:
使用foo作为(选择convert_timezone('US/Eastern','US/Pacific','2020-01-24 14:27:12')作为foo)选择EXTRACT(HOUR FROM foo)作为ex,DATE_PART('HOUR',foo::timestamp)作为foo的dp
所以我的答案很有帮助,我相信是正确的,因为我不知道设定了什么时区,但我确实把你带到了正确的方向。我只想说,你可以放弃投票给那些有帮助的答案,而接受那些正确的答案。。。很乐意帮忙,干杯!谢谢为未来的人们阅读:TL;DR:在Amazon Redshift上使用
convert_timezone
,不要在时区x使用
。Show timezone显示数据库使用UTC,但在示例中使用17:27:12作为foo,在datepart/extract中使用22仍然完全不正确。应该分别是06:27:12和6点。我不确定是什么导致了这个问题的发生,但你的笔记可能是一个原因。我确实试过美国/洛杉矶,但结果同样不正确。然而,这确实有效:
使用foo作为(选择convert_timezone('US/Eastern','US/Pacific','2020-01-24 14:27:12')作为foo)选择EXTRACT(HOUR FROM foo)作为ex,DATE_PART('HOUR',foo::timestamp)作为foo的dp
所以我的答案很有帮助,我相信是正确的,因为我不知道设定了什么时区,但我确实把你带到了正确的方向。我只想说,你可以放弃投票给那些有帮助的答案,而接受那些正确的答案。。。很乐意帮忙,干杯!谢谢为未来的人们阅读:TL;DR:在Amazon Redshift上使用
convert_时区
,不要在时区x使用
。John,我得到了与您显示的相同的结果,我的时区设置为UTC。然而,第22小时是不正确的。应该是6点。似乎有一个错误的时候