【问题标题】:to_char() issue in PostgreSQLPostgreSQL 中的 to_char() 问题
【发布时间】:2012-08-27 05:41:17
【问题描述】:

我有一个 PostgreSQL 表,其中有一个名为 effective_date 的字段,数据类型是整数(纪元日期)。我想要做的是只选择具有我选择的有效日期的条目(我只想按月份查询)。我的查询如下,问题是,尽管该表确实有许多符合选择条件的条目,但它没有返回任何内容。

$query = "select    *
          from ". $this->getTable() ."
          where pay_stub_entry_name_id = 43
          AND to_char(effective_date, 'Mon') = 'Jul'
          AND deleted = 0";

【问题讨论】:

  • 等等,你说effective_date 的数据类型是integer 吗?不是date?不是timestamp?你的问题有错误吗?如果它是一个整数,你如何期望从中得到一个日期?它是一个纪元日期(自某个日期以来的秒数)?
  • @Craig 对不起我的错误。是的,这是一个纪元日期。
  • 那么,to_char 会怎么做呢?您在psql 中尝试过吗?让我们看看:select to_char( extract(epoch from current_timestamp), 'Mon') 只是输出字符串Mon,它永远不会等于字符串Jul。所以这是你的问题,你调用了to_char 的整数版本,并期望它只知道你想将整数视为日期。请参阅 psql 中的 \df to_char 以查看所有 to_char 变体。只有timestamp 可以按照documentation 使用日期格式
  • @CraigRinger 谢谢它的工作。你解释得很好。 :)

标签: postgresql to-char


【解决方案1】:

使用extract(month from the_date) 而不是to_char。见datetime functions in the Pg docs

使用to_char,您会遇到各种大小写、本地化等问题。

假设你的意思是effective_date 的数据类型是timestampdate,你会写:

$query = "select    *
      from ". $this->getTable() ."
      where pay_stub_entry_name_id = 43
      AND extract(month from effective_date) = 7
      AND deleted = 0";

如果是integer,那么-假设它是一个纪元日期-您必须将其转换为带有to_timestamp的时间戳,然后在其上使用extract。请参阅上面链接的文档中的epoch 部分,例如:

$query = "select    *
      from ". $this->getTable() ."
      where pay_stub_entry_name_id = 43
      AND extract(month from to_timestamp(effective_date)) = 7
      AND deleted = 0";

问题的直接原因是您使用整数纪元日期调用to_char(integer,text)。只有timestamp 版本的to_char 进行日期格式化; Mon 对其他人来说并不特殊,因此它只是作为文字字符串 Mon 输出。比较:

regress=# SELECT to_char(current_timestamp, 'Mon');
 to_char 
---------
 Aug
(1 row)

regress=# select to_char( extract(epoch from current_timestamp), 'Mon');
 to_char 
---------
 Mon
(1 row)

请记住参数化这些查询的真实版本,以帮助避免SQL injection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多