如何从vertica中的间隔获取日期时间
How to get datetime from interval in vertica
我是 vertica 新手。
我正在尝试获取提供的秒数的日期时间。
我有 1980-01-01 的秒值。
当我这样尝试时:
\set interval '''1199283171.887953002212558175021 SECOND'''
SELECT DATE('1980-01-01') + INTERVAL :interval
我得到我的输出:
2018-01-01 14:12:51.887953
(设置为可变间隔的秒值之一。在 Linux putty 中尝试)
但我想在 table 中为我的 100 条记录使用它。这仅适用于单一输入。
我试过了,但没有成功。
如何为所有值执行此操作?
如果我没理解错的话,你的浮点值是秒的 100 倍,这意味着自“1980-01-01 00:00:00”以来经过的秒数可能是 UTC。
我找到了三种执行此操作的方法 - 正如您在此处看到的那样,有一个 10 行的示例 table。
我只是懒惰,将 << n >> 次 3600 秒添加到您的初始秒值。使其可读,因为结果时间戳中的小时仅发生变化。如您所见,所有表达式 return 相同。
有帮助吗?
WITH input(secs) AS (
SELECT 1199283171.887953002212558175021 + 0 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 1 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 2 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 3 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 4 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 5 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 6 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 7 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 8 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 9 * 3600
)
SELECT
secs
, '1980-01-01'::TIMESTAMP + (secs::VARCHAR(32)||' SECOND')::INTERVAL AS add_interval
, '1980-01-01'::TIMESTAMP + (secs/86400) AS add_day_fraction
, TIMESTAMPADD(MICROSECOND,(1000000*secs)::INT, '1980-01-01'::TIMESTAMP) AS using_function
FROM input;
secs | add_interval | add_day_fraction | using_function
----------------------------------+----------------------------+----------------------------+----------------------------
1199283171.887953002212558175021 | 2018-01-01 14:12:51.887953 | 2018-01-01 14:12:51.887953 | 2018-01-01 14:12:51.887953
1199286771.887953002212558175021 | 2018-01-01 15:12:51.887953 | 2018-01-01 15:12:51.887953 | 2018-01-01 15:12:51.887953
1199290371.887953002212558175021 | 2018-01-01 16:12:51.887953 | 2018-01-01 16:12:51.887953 | 2018-01-01 16:12:51.887953
1199293971.887953002212558175021 | 2018-01-01 17:12:51.887953 | 2018-01-01 17:12:51.887953 | 2018-01-01 17:12:51.887953
1199297571.887953002212558175021 | 2018-01-01 18:12:51.887953 | 2018-01-01 18:12:51.887953 | 2018-01-01 18:12:51.887953
1199301171.887953002212558175021 | 2018-01-01 19:12:51.887953 | 2018-01-01 19:12:51.887953 | 2018-01-01 19:12:51.887953
1199304771.887953002212558175021 | 2018-01-01 20:12:51.887953 | 2018-01-01 20:12:51.887953 | 2018-01-01 20:12:51.887953
1199308371.887953002212558175021 | 2018-01-01 21:12:51.887953 | 2018-01-01 21:12:51.887953 | 2018-01-01 21:12:51.887953
1199311971.887953002212558175021 | 2018-01-01 22:12:51.887953 | 2018-01-01 22:12:51.887953 | 2018-01-01 22:12:51.887953
1199315571.887953002212558175021 | 2018-01-01 23:12:51.887953 | 2018-01-01 23:12:51.887953 | 2018-01-01 23:12:51.887953
我是 vertica 新手。
我正在尝试获取提供的秒数的日期时间。
我有 1980-01-01 的秒值。
当我这样尝试时:
\set interval '''1199283171.887953002212558175021 SECOND'''
SELECT DATE('1980-01-01') + INTERVAL :interval
我得到我的输出:
2018-01-01 14:12:51.887953
(设置为可变间隔的秒值之一。在 Linux putty 中尝试)
但我想在 table 中为我的 100 条记录使用它。这仅适用于单一输入。 我试过了,但没有成功。
如何为所有值执行此操作?
如果我没理解错的话,你的浮点值是秒的 100 倍,这意味着自“1980-01-01 00:00:00”以来经过的秒数可能是 UTC。
我找到了三种执行此操作的方法 - 正如您在此处看到的那样,有一个 10 行的示例 table。
我只是懒惰,将 << n >> 次 3600 秒添加到您的初始秒值。使其可读,因为结果时间戳中的小时仅发生变化。如您所见,所有表达式 return 相同。
有帮助吗?
WITH input(secs) AS (
SELECT 1199283171.887953002212558175021 + 0 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 1 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 2 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 3 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 4 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 5 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 6 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 7 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 8 * 3600
UNION ALL SELECT 1199283171.887953002212558175021 + 9 * 3600
)
SELECT
secs
, '1980-01-01'::TIMESTAMP + (secs::VARCHAR(32)||' SECOND')::INTERVAL AS add_interval
, '1980-01-01'::TIMESTAMP + (secs/86400) AS add_day_fraction
, TIMESTAMPADD(MICROSECOND,(1000000*secs)::INT, '1980-01-01'::TIMESTAMP) AS using_function
FROM input;
secs | add_interval | add_day_fraction | using_function
----------------------------------+----------------------------+----------------------------+----------------------------
1199283171.887953002212558175021 | 2018-01-01 14:12:51.887953 | 2018-01-01 14:12:51.887953 | 2018-01-01 14:12:51.887953
1199286771.887953002212558175021 | 2018-01-01 15:12:51.887953 | 2018-01-01 15:12:51.887953 | 2018-01-01 15:12:51.887953
1199290371.887953002212558175021 | 2018-01-01 16:12:51.887953 | 2018-01-01 16:12:51.887953 | 2018-01-01 16:12:51.887953
1199293971.887953002212558175021 | 2018-01-01 17:12:51.887953 | 2018-01-01 17:12:51.887953 | 2018-01-01 17:12:51.887953
1199297571.887953002212558175021 | 2018-01-01 18:12:51.887953 | 2018-01-01 18:12:51.887953 | 2018-01-01 18:12:51.887953
1199301171.887953002212558175021 | 2018-01-01 19:12:51.887953 | 2018-01-01 19:12:51.887953 | 2018-01-01 19:12:51.887953
1199304771.887953002212558175021 | 2018-01-01 20:12:51.887953 | 2018-01-01 20:12:51.887953 | 2018-01-01 20:12:51.887953
1199308371.887953002212558175021 | 2018-01-01 21:12:51.887953 | 2018-01-01 21:12:51.887953 | 2018-01-01 21:12:51.887953
1199311971.887953002212558175021 | 2018-01-01 22:12:51.887953 | 2018-01-01 22:12:51.887953 | 2018-01-01 22:12:51.887953
1199315571.887953002212558175021 | 2018-01-01 23:12:51.887953 | 2018-01-01 23:12:51.887953 | 2018-01-01 23:12:51.887953