Sql 从时间戳中提取日期部分
我试图从带有时区的时间戳中提取小时。然而,我的时间来错了 下面是一个示例,我正在使用Dbeaver并将时区设置为EST: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
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
似乎没有给我想要的时间。它看起来像是将17作为EST,然后将其转换为UTC。以下是我期望得到的:DATE\u部分
它对我来说非常好(使用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点。似乎有一个错误的时候