- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PostgreSQL timestamp踩坑记录与填坑指南由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
项目Timezone情况 。
NodeJS:UTC+08 。
PostgreSQL:UTC+00 。
1
2
3
4
5
6
7
8
9
10
|
timestampTest.js
const { Client } = require(
'pg'
)
const client = new Client()
client.
connect
()
let sql = ``
client.query(sql, (err, res) => {
console.log(err ? err.stack : res.
rows
[0].datetime)
client.
end
()
})
|
不同时区to_timestamp查询结果 。
测试输入数据为1514736000(UTC时间2017-12-31 16:00:00,北京时间2018-01-01 00:00:00) 。
1、timezone=UTC 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'UTC'
;
SELECT
to_timestamp(1514736000)
as
datetime;
END
;
|
直接查询:2017-12-31 16:00:00+00YES 。
pg查询:2017-12-31T16:00:00.000ZYES 。
2、timezone=PRC 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'PRC'
;
SELECT
to_timestamp(1514736000)
as
datetime;
END
;
|
直接查询:2018-01-01 00:00:00+08NO 。
pg查询:2017-12-31T16:00:00.000ZYES 。
PostgreSQL官方文档对timestamp的一个描述 。
详见:8.5.1.3. Time Stamps 。
In a literal that has been determined to be timestamp without time zone, PostgreSQL will silently ignore any time zone indication. That is, the resulting value is derived from the date/time fields in the input value, and is not adjusted for time zone. 。
坑 。
使用to_timestamp进行时间转换且DB时区非UTC时,写入**timestamp without time zone**类型的COLUMN则会与预期结果不符.
不同Timezone/columnType查询结果 。
1、timezone=UTC,timestamp with timezone 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'UTC'
;
SELECT
TIMESTAMP
WITH
TIME
ZONE
'2017-12-31T16:00:00+00'
as
datetime;
END
;
|
直接查询:2017-12-31 16:00:00+00YES 。
pg查询:2017-12-31T16:00:00.000ZYES 。
2、timezone=UTC,timestamp without timezone 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'UTC'
;
SELECT
TIMESTAMP
'2017-12-31T16:00:00+00'
as
datetime;
END
;
|
直接查询:2017-12-31 16:00:00YES 。
pg查询:2017-12-31T08:00:00.000ZNO 。
3、timezone=PRC,timestamp with timezone 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'PRC'
;
SELECT
TIMESTAMP
WITH
TIME
ZONE
'2017-12-31T16:00:00+00'
as
datetime;
END
;
|
直接查询:2018-01-01 00:00:00+08YES 。
pg查询:2017-12-31T16:00:00.000ZYES 。
4、timezone=PRC,timestamp without timezone 。
1
2
3
4
|
BEGIN
;
SET
TIME
ZONE
'PRC'
;
SELECT
TIMESTAMP
'2017-12-31T16:00:00+00'
as
datetime;
END
;
|
直接查询:2017-12-31 16:00:00YES 。
pg查询:2017-12-31T08:00:00.000ZNO 。
据以上结果可判定:
使用pg查询**timestamp without time zone**类型的COLUMN时,会将数据库存储的时间当做北京时间而非UTC时间,与数据库时区没有关系.
总结 。
网上类似问题的解决办法是将DB时区改为UTC+08.
原理:写入DB的时间实际为北京时间,pg库恰好是当做北京时间读取,所以时间戳就不会出问题了.
假如应用部署在不同的地域,使用timestamp without time zone存储timestamp这样的设计简直是灾难.
不要用timestamp without time zone存储timestamp.
不要用timestamp without time zone存储timestamp.
不要用timestamp without time zone存储timestamp.
补充:pg查询时间间隔(timestamp类型) 。
1
|
create_date
timestamp
(6) without
time
zone
|
1.从2015-10-12到2015-10-13 之间的4点到9点的数据 。
1
2
3
4
|
select
*
from
schedule
where
create_date
between
to_date(
'2015-10-12'
,
'yyyy-MM-dd'
)
and
to_date(
'2015-10-13'
,
'yyyy-MM-dd'
)
and
EXTRACT(
hour
from
create_date)
between
4
and
9;
|
结果:
2.2015-10-12五点的数据 。
1
|
select
*
from
schedule
where
hospital_id=
'syzyyadmin'
and
date_trunc(
'hour'
,create_date)=to_timestamp(
'2015-10-12 05'
,
'YYYY-MM-DD HH24'
)
|
结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://my.oschina.net/janfon/blog/1795868 。
最后此篇关于PostgreSQL timestamp踩坑记录与填坑指南的文章就讲到这里了,如果你想了解更多关于PostgreSQL timestamp踩坑记录与填坑指南的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
标题基本上说明了一切。 我主要对更新案例感兴趣。假设我们正在尝试更新具有时间戳记字段的记录,并且我们希望将该字段设置为记录更新的时间戳记。有没有办法做到这一点? 最佳答案 经过一些实验,我找到了合适的
我正在学习一门类(class),其中我必须将日期转换为 unix 时间戳。 import pandas as pd df = pd.read_csv('file.csv') print type(df
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
bson.timestamp.Timestamp需要两个参数:time 和 inc。 time 显然是存储在 Timestamp 中的时间值。 什么是公司?它被描述为递增计数器,但它有什么用途呢?它应
2016-08-18 04:52:14 是我从数据库中获取的时间戳,用于跟踪我想从哪里加载更多记录,这些记录小于该时间 这是代码 foreach($explode as $stat){
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我是 Java 新手。我正在使用两个 Timestamp 对象 dateFrom和dateTo 。我想检查是否dateFrom比 dateTo早 45 天。我用这个代码片段来比较这个 if(dateF
在将 panda 对象转换为时间戳时,我遇到了这个奇怪的问题。 Train['date'] 值类似于 01/05/2014,我正在尝试将其转换为 linuxtimestamp。 我的代码: Train
我正在努力让我的代码运行。时间戳似乎有问题。您对我如何更改代码有什么建议吗?我看到之前有人问过这个问题,但没能成功。 这是我在运行代码时遇到的错误:'Timestamp' object has no
我正在尝试运行以下查询: SELECT startDate FROM tests WHERE startDate BETWEEN TIMESTAMP '1555248497'
我正在使用 Athena 查询以 bigInt 格式存储的日期。我想将其转换为友好的时间戳。 我试过了: from_unixtime(timestamp DIV 1000) AS readab
最近进行了一些数据库更改,并且 hibernate 映射出现了一些困惑。 hibernate 映射: ...other fields 成员模型对象: public class Mem
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
我必须在我的数据库中保存 ServerValue.TIMESTAMP 但它必须是一个字符串。当我键入 String.valueOf(ServerValue.TIMESTAMP); 或 ServerVa
在我的程序中,每个表都有一列 last_modified: last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp)
我想将此时间戳对象转换为日期时间此对象是在数据帧上使用 asfreq 后获得的这是最后一个索引 Timestamp('2018-12-01 00:00:00', freq='MS') 想要的输出 2
我有一个包含时间序列传感器数据的大表。大型是指分布在被监控的各个 channel 中的从几千到 10M 的记录。对于某种传感器类型,我需要计算当前读数和上一个读数之间的时间间隔,即找到当前读数之前的最
我是一名优秀的程序员,十分优秀!