PostgreSQL中的to_char()问题

时间:2012-08-27 05:41:17

标签: postgresql to-char

我有一个名为effective_date的字段的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";

1 个答案:

答案 0 :(得分:3)

使用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