Unix 时间戳是自 UTC 时间 1970 年 1 月 1 日午夜以来的秒数。
如何从 PostgreSQL 获取正确的 unix 时间戳?
与currenttimestamp.com和timestamp.1e5b.de相比时,我没有从 PostgreSQL 得到预期的时间:
这将返回正确的时间戳:
SELECT extract(epoch from now());
Run Code Online (Sandbox Code Playgroud)
虽然这不会:
SELECT extract(epoch from now() at time zone 'utc');
Run Code Online (Sandbox Code Playgroud)
我住在 UTC +02 时区。从 PostgreSQL 获取当前 unix 时间戳的正确方法是什么?
这将返回正确的时间和时区:
SELECT now();
now
-------------------------------
2011-05-18 10:34:10.820464+02
Run Code Online (Sandbox Code Playgroud)
另一个对比:
select now(),
extract(epoch from now()),
extract(epoch from now() at time zone 'utc');
now | date_part | date_part
-------------------------------+------------------+------------------
2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933
(1 …Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 中,我使用now()andcurrent_timestamp函数,我看不出有什么区别:
# SELECT now(), current_timestamp;
now | now
--------------------------------+--------------------------------
04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
关于两者之间的差异,有一个很长且相当清晰的答案
TIMESTAMP WITH TIME ZONE
-vs-TIMESTAMP WITHOUT TIME ZONE在 SO post Ignoring time zone together in Rails and PostgreSQL 中可用。
我想知道的是:实际使用是否有任何有效的用例,TIMESTAMP WITHOUT TIME ZONE或者应该将其视为反模式?
如何设置默认值为当前 UTC 时间的时间戳列?
MySQL 使用UTC_TIMESTAMP()UTC 时间戳函数:
mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
所以我试过:
CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
Run Code Online (Sandbox Code Playgroud)
和其他变体,如UTC_TIMESTAMP(),但没有成功。
我timestamp without time zone default now()在 PostgreSQL 数据库中有一个类型为“创建”的列。
如果我选择 colums,默认情况下它有一个漂亮且可读的格式:
SELECT created FROM mytable;
created
---------------------------
2011-05-17 10:40:28.876944
Run Code Online (Sandbox Code Playgroud)
但我想在几毫秒内获得时间戳(作为一个 Long)。像这样的东西:
SELECT myformat(created) FROM mytable;
created
-----------------
2432432343876944
Run Code Online (Sandbox Code Playgroud)
如何仅在几毫秒内从 PostgreSQL 获取时间戳列?
回复杰克:
我确实得到与您相同的差异(-3600),但是如果我使用timestamp with time zone我可以看到“错误”或差异是因为 '1970-01-01' 获得 time zone +01。
create table my_table_2(created timestamp with time zone);
CREATE TABLE
insert into my_table_2 (created) values (now()), ('1970-01-01');
INSERT 0 2
select created, extract(epoch from created) from my_table_2;
created | date_part
-------------------------------+------------------
2011-05-18 11:03:16.909338+02 | 1305709396.90934
1970-01-01 …Run Code Online (Sandbox Code Playgroud) 我正在研究 PostgreSQL 数据库设计,我想知道如何最好地存储时间戳。
不同时区的用户将使用数据库执行所有 CRUD 功能。
我查看了 2 个选项:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
因为timestamp我会发送一个字符串来表示 INSERT 时刻的确切(UTC)时间戳。
因为bigint我会存储完全相同的东西,但以数字格式存储。(时区问题是在将毫秒移交给服务器之前处理的,因此总是以 UTC 为单位的毫秒。)
存储 a 的一个主要优点bigint可能是它更容易存储和检索,因为传递正确格式的时间戳比简单的数字(自 Unix Epoc 以来的毫秒)更复杂。
我的问题是哪种方法可以实现最灵活的设计,以及每种方法可能存在哪些缺陷。
我无法设置Current_timestamp为默认值。我的Mysql版本是5.5.47.
查询是
ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;
Run Code Online (Sandbox Code Playgroud)
虽然它在我的本地数据库上使用mysql V5.6.56.
我有一个运行在服务器上的 PostgreSQL 数据库,它的时区设置为印度的时区(即 UTC +5:30)
我在一个表中有一些数据,它是这样创建的:
CREATE TABLE "CLOUDDATA"
(
"CD_Tm_Obs" timestamp without time zone,
"CD_Avg_Cloud" double precision
)
Run Code Online (Sandbox Code Playgroud)
我想查询数据并获取特定时间的值。我的输入将是 Unix 时间戳(即 1970 年 1 月 1 日的秒数)
转换UNIX时间时间戳我发现的唯一方法是这样的:
select to_timestamp(TRUNC(CAST(1395036000 AS bigint)))。但这会创建一个带时区的时间戳。我的数据在 中timestamp without time zone,所以我没有得到任何结果。
如何在没有时区的情况下将 unix 时间转换为 PostgreSQL 的 Timstamp?
在 Postgres 9.5 中,我很惊讶地看到在尝试 year 0001(没有 year zero 0000)时看到的结果。
-07:52:58?一些示例代码。请注意,我混合使用了TIMESTAMP WITH TIME ZONE和TIMESTAMP WITHOUT TIME ZONE,所以请仔细阅读。
SET TIME ZONE 'America/Los_Angeles' ;
SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',
TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z',
TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;
("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")
Run Code Online (Sandbox Code Playgroud)
我对第二个值感到惊讶:0001-12-31 16:07:02-07:52:58 BC. 我知道我们必须America/Los_Angeles在 UTC后八小时后退八小时,偏移量为-08:00. 但不是-08:00偏移量是-07:52:58. 为什么?
在 UTC 下输入数据时没有这样的问题。
SET TIME ZONE 'UTC' …Run Code Online (Sandbox Code Playgroud) 可以CURRENT_TIMESTAMP用作PRIMARY KEY?
是否有可能两个或多个不同的 INSERT 得到相同的结果CURRENT_TIMESTAMP?
timestamp ×10
postgresql ×8
timezone ×3
utc-time ×2
datatypes ×1
date ×1
date-format ×1
mysql ×1
mysql-5.5 ×1
primary-key ×1
syntax ×1