也许你需要一个不同的"约会风格"设置

YAM*_*YAM 10 sql postgresql postgresql-9.3

我有一个表有一个 日期类型的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')
Run Code Online (Sandbox Code Playgroud)

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

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

然后我改变了查询

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')
Run Code Online (Sandbox Code Playgroud)

它工作正常.

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

任何种类的日期格式都转换为系统数据库.

谢谢

Tho*_*ner 10

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

在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
  );
Run Code Online (Sandbox Code Playgroud)

(感谢a_horse_with_no_name指示我在PostgreSQL中使用正确的日期文字语法.)

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

TO_DATE('06/05/2015', 'DD/MM/YYYY')
TO_DATE('05/06/2015', 'MM/DD/YYYY')
Run Code Online (Sandbox Code Playgroud)

  • 我首选的写日期、时间或时间戳文字的方式是 ANSI 语法:`date '2016-01-13'` 或 `timestamp '2016-01-13 17:38:42'`,它具有额外的好处跨多个(虽然不是全部)DBMS (2认同)

Rui*_*ima 9

在你的 postgresql.conf 中,你有一个名为 datestyle 的设置,它由 out 和 in 两部分组成。可能设置为iso, mdy(输出为 ISO,输入为美国)尝试将其设置为iso, dmy

截屏