校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > PostgreSQL timestamp踩坑記錄與填坑指南

PostgreSQL timestamp踩坑記錄與填坑指南

熱門標簽:重慶自動外呼系統定制 地圖標注和圖片名稱的區別 外呼調研系統 漯河外呼電話系統 海豐有多少商家沒有地圖標注 辦公外呼電話系統 美容工作室地圖標注 合肥公司外呼系統運營商 打電話智能電銷機器人授權

項目Timezone情況

NodeJS:UTC+08

PostgreSQL:UTC+00

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

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

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

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

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

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

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類型)

create_date timestamp(6) without time zone

1.從2015-10-12到2015-10-13 之間的4點到9點的數據

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五點的數據

select * from schedule where hospital_id='syzyyadmin' and date_trunc('hour',create_date)=to_timestamp('2015-10-12 05','YYYY-MM-DD HH24')

結果:

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL的generate_series()函數的用法說明
  • Postgresql通過查詢進行更新的操作
  • 如何為PostgreSQL的表自動添加分區
  • postgresql 實現得到時間對應周的周一案例
  • PostgreSQL的upsert實例操作(insert on conflict do)
  • PostgreSQL 字符串拆分與合并案例
  • 淺談PostgreSQL消耗的內存計算方法

標簽:晉城 蚌埠 株洲 來賓 珠海 衡陽 烏海 錦州

巨人網絡通訊聲明:本文標題《PostgreSQL timestamp踩坑記錄與填坑指南》,本文關鍵詞  PostgreSQL,timestamp,踩坑,記錄,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL timestamp踩坑記錄與填坑指南》相關的同類信息!
  • 本頁收集關于PostgreSQL timestamp踩坑記錄與填坑指南的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 额济纳旗| 延安市| 库伦旗| 潮安县| 客服| 镇坪县| 德保县| 天柱县| 临桂县| 华宁县| 南雄市| 溧阳市| 盖州市| 开化县| 五台县| 五大连池市| 盐源县| 溧阳市| 壤塘县| 金山区| 西丰县| 新郑市| 永登县| 阳山县| 历史| 澳门| 上饶市| 濮阳市| 拜泉县| 鹤庆县| 木兰县| 石嘴山市| 古丈县| 通山县| 阿图什市| 巨鹿县| 清水河县| 莲花县| 扎兰屯市| 呼图壁县| 扎囊县|