【问题标题】:Perhaps you need a different "datestyle" setting也许您需要不同的“日期样式”设置
【发布时间】:2016-04-18 01:51:14
【问题描述】:

我有一张表,其中有一列 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)我如何根据数据库进行转换?

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

谢谢

【问题讨论】:

  • 你可以使用SELECT TO_CHAR(NOW(), 'yyyy/mm/dd')::date;
  • 如何在我的桌子上应用这个我使用 '16/05/2015' 而不是 now() 它仍然给出错误:函数 to_char(unknown, unknown) is not unique
  • 如果日期“可能是任何风格”,那么你就不走运了。 PG 识别许多日期格式,但有些是模棱两可的,有些有默认解释(在您的情况下为mm/dd/yyyy)。您可能应该在客户端设置一些标准,以便以特定格式输入所有日期,然后您可以使用to_date() 让 PG 理解它,以防它不是 ISO 样式。
  • @Patrick 这对我来说是个坏消息
  • 如果你得到不同格式的日期,你也应该从那里得到格式。 IE。给你“01/02/2015”的某个人或系统也应该能够告诉你这是“MM/DD/YYYY”还是“DD/MM/YYYY”。否则无法保证正确导入日期。如果您获得格式,只需应用它:to_date(:datestring, :formatstring)

标签: sql postgresql postgresql-9.3


【解决方案1】:

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

在 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 是月份,还是相反?”仅“2015 年 1 月 2 日”的信息是不完整的。 DD 代表日,MM 代表月,YYYY 代表年。如果答案是“日-月-年”,则格式为“DD/MM/YYYY”。如果你的问题没有得到答案,你就不能把数据放到你的数据库中;它不完整,您可能会错误地导入错误的数据;所以拒绝这样做。
  • 我首选的编写日期、时间或时间戳文字的方式是 ANSI 语法:date '2016-01-13'timestamp '2016-01-13 17:38:42',它还有一个额外的好处是它可以跨多个(尽管不是全部)DBMS 工作
  • @a_horse_with_no_name:感谢他提供的信息。这也是我的首选方式。我知道它可以在 Oracle 中工作,但不知道 PostgreSQL 使用相同的语法。我在 postgre 中搜索了日期文字,发现的只是没有日期或时间戳关键字的字符串。 (愚蠢的我,它很容易找到。它在日期/时间函数和运算符postgresql.org/docs/8.0/static/functions-datetime.html 中)。你是对的,应该这样做。我将编辑我的答案。
  • 这就是它在 SQL 标准中定义的方式(顺便说一句:它是 Postgres,而不是 Postgre)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多