3

我有一个 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";
4

1 回答 1

3

使用extract(month from the_date)而不是to_char. 请参阅Pg 文档中的日期时间函数

to_char您一起,您将遇到各种案例、本地化等问题。

假设你的意思是数据类型effective_datetimestampor date,你会写:

$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_charMonMon

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 注入

于 2012-08-27T05:42:40.760 回答