也许您需要更改“datestyle”设置

30

我有一张表格,其中有一个日期类型的列 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),我该如何根据数据库进行转换?

任何日期格式都可以转换为系统数据库。

谢谢你。


1
你可以使用 SELECT TO_CHAR(NOW(), 'yyyy/mm/dd')::date; - Vivek S.
我该如何将这个应用于我的表格?我使用了“16/05/2015”代替now(),但仍然出现错误:to_char(unknown, unknown)函数不唯一。 - YAM
1
如果日期“可能以任何样式呈现”,那么你就没办法了。PG识别许多日期格式,但有些是模糊的,有些有默认解释(在您的情况下为mm/dd/yyyy)。您应该在客户端设置一些标准,使所有日期以特定格式输入,然后您可以使用to_date()将其转换为PG可以理解的格式,以防它不是ISO样式。 - Patrick
@Patrick,这对我来说是个坏消息。 - YAM
如果你得到不同格式的日期,你也应该从中获取格式。例如,某些人或系统给你“01/02/2015”,也应该能够告诉你这是“MM/DD/YYYY”还是“DD/MM/YYYY”。否则,无法保证正确导入日期。如果你得到了格式,只需应用它:to_date(:datestring, :formatstring) - Thorsten Kettner
2个回答

33

您正在使用字符串来表示日期,并依赖会话设置来正确解释这些字符串。建议使用支持的日期字面量,以使其独立于设置。

在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')

当有人说“这个花费10”,你会问“10什么?美元?分?欧元?”单独的数字10是不完整的。当有人说将日期“01/02/2015”放入数据库时,你会问“01是日还是月,02是月还是日?”单独的信息“01/02/2015”也是不完整的。DD代表日,MM代表月,YYYY代表年。如果答案是“它是日-月-年”,那么格式就是“DD/MM/YYYY”。如果你的问题没有得到回答,你就不能将数据放入数据库;它是不完整的,你可能会错误地导入错误的数据;所以拒绝这样做。 - Thorsten Kettner
3
我喜欢使用 ANSI 语法来书写日期、时间或时间戳字面量:date '2016-01-13'timestamp '2016-01-13 17:38:42',这种方法的好处是它可以适用于多个(但不是全部)DBMS。 - user330315
@a_horse_with_no_name:谢谢你的信息。这也是我喜欢的方法。我知道Oracle可以使用,但不知道PostgreSQL也使用相同的语法。我在PostgreSQL中搜索日期字面值,但找到了一些没有包含日期或时间戳关键字的字符串。(太蠢了,很容易找到。在日期/时间函数和操作符中http://www.postgresql.org/docs/8.0/static/functions-datetime.html)。你是对的,应该这样做。我会编辑我的回答。 - Thorsten Kettner
这是在SQL标准中定义的方式(顺便说一下:它是Postgres,而不是Postgre)。 - user330315

9
在你的postgresql.conf文件中,有一个名为datestyle的设置,它由两部分组成:out和in。 可能被设置为iso,mdy(输出为ISO格式,输入为美国格式),尝试将其设置为iso,dmy
图片请参见链接:screenshot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接