我有一个名为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";
答案 0 :(得分:3)
使用extract(month from the_date)
代替to_char
。请参阅datetime functions in the Pg docs。
使用to_char
,您会遇到各种与案例,本地化等问题相关的问题。
假设您的意思是effective_date
的数据类型为timestamp
或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_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。