也许您需要不同的“日期样式”设置

问题描述 投票:0回答:2

我有一个表,其中有一列日期类型的order_date

查询:

INSERT INTO uni_data_temp(sale_order_item_code, 
            order_date, sale_order_item_status, tracking_number, dispatch_date, 
            user_id) VALUES ('1000932515',  cast('16/05/2015' as date), 'DISPATCHED', 'UNIPAYP1958141', '2015/05/20', '4')

当我运行此查询时,它给出错误:

ERROR: date/time field value out of range: "16/05/2015"
SQL state: 22008
Hint: Perhaps you need a different "datestyle" setting.
Character: 380

然后我改变了查询

INSERT INTO uni_data_temp(sale_order_item_code, 
            order_date, sale_order_item_status, tracking_number, dispatch_date, 
            user_id) VALUES ('1000932515',  cast('2015/05/16' as date), 'DISPATCHED', 'UNIPAYP1958141', '2015/05/20', '4')

效果很好。

但我的问题是我的日期可能是任何样式(yyyy/mm/dd 或 dd/mm/yyyy)我如何根据数据库投射它?

任何类型的日期格式转换成系统数据库。

谢谢你

sql postgresql postgresql-9.3
2个回答
36
投票

您正在使用字符串作为日期,并依赖会话设置来正确解释字符串。请改用支持的日期文字,以便独立于设置。

在 PostgreSQL(以及与此相关的 SQL 标准)中,DATE 'YYYY-MM-DD' 被视为日期文字,并且是我推荐的格式。所以使用

INSERT INTO uni_data_temp
  ( sale_order_item_code
  , order_date
  , sale_order_item_status
  , tracking_number
  , dispatch_date
  , user_id
  ) 
VALUES 
  ( '1000932515'
  , DATE '2015-05-16'
  , 'DISPATCHED'
  , 'UNIPAYP1958141'
  , DATE '2015-05-20'
  , 4
  );

(感谢 a_horse_with_no_name 为我指出 PostgreSQL 中正确的日期文字语法。)

但是,如果您从某处获取字符串形式的日期,则需要应用相应的格式:

TO_DATE('06/05/2015', 'DD/MM/YYYY')
TO_DATE('05/06/2015', 'MM/DD/YYYY')

使用类似下面的查询来提供正确的格式:

UPDATE table name SET column2  = to_date(column1, 'dd-MM-yyyy HH24:MI:SS')

9
投票

在你的 postgresql.conf 中有一个名为 datestyle 的设置,它由 out 和 in 两部分组成。 可能设置为

iso, mdy
(输出为 ISO,输入为美式)尝试将其设置为
iso, dmy

screenshot

© www.soinside.com 2019 - 2024. All rights reserved.