我正在运行pgAdmin3对我的postgresql数据库的查询。我想知道为什么它会返回值但是所有预期值。查询是:
SELECT P.SURNAME,
TO_CHAR(TO_DATE(SFE.GRANTDATE,'YYYY-MM-DD'),'DD Mon YY') AS GRANTDATE,
TO_CHAR(TO_DATE(SFE.REVOKEDATE,'YYYY-MM-DD'),'DD Mon YY') AS REVOKEDATE,
SFE.feedname
FROM SYS_FEED SFE,
PRINCIPLE P
WHERE SFE.USERID = P.ID
AND to_date(GRANTDATE,'YYYY-MM-DD') <= to_date('Nov-2006','Mon-YYYY')
GRANTDATE列是类型日期,包含格式为2006-09-04的值。我想返回GRANTDATE小于或等于提供的月份的所有行。我遇到的问题是它返回的所有&#34;小于&#34;匹配行但不返回&#34;等于&#34;行。所以2006年1月至2006年10月是,但不是2006年11月。
任何建议都会很棒。
答案 0 :(得分:2)
尝试:
SELECT P.SURNAME,
TO_CHAR(TO_DATE(SFE.GRANTDATE,'YYYY-MM-DD'),'DD Mon YY') AS GRANTDATE,
TO_CHAR(TO_DATE(SFE.REVOKEDATE,'YYYY-MM-DD'),'DD Mon YY') AS REVOKEDATE,
SFE.feedname
FROM SYS_FEED SFE,
PRINCIPLE P
WHERE SFE.USERID = P.ID
AND to_date(GRANTDATE,'YYYY-MM-DD') < (to_date('Nov-2006','Mon-YYYY') + interval '1 month');
问题:当您执行to_date('Nov-2006','Mon-YYYY')
时,您会获得2006-11-01
。因此,唯一等于to_date('Nov-2006','Mon-YYYY')
的日期是2006-11-01
,而不是整个月。
编辑。另一种方式:
SELECT P.SURNAME,
TO_CHAR(TO_DATE(SFE.GRANTDATE,'YYYY-MM-DD'),'DD Mon YY') AS GRANTDATE,
TO_CHAR(TO_DATE(SFE.REVOKEDATE,'YYYY-MM-DD'),'DD Mon YY') AS REVOKEDATE,
SFE.feedname
FROM SYS_FEED SFE,
PRINCIPLE P
WHERE SFE.USERID = P.ID
AND date_trunc('month', to_date(GRANTDATE,'YYYY-MM-DD')) <= to_date('Nov-2006','Mon-YYYY');
答案 1 :(得分:2)
正如欧文所说:日期没有格式。另外:没有必要对字符进行过多的日期过滤。
此外:即使对于最终查询结果,您也可以执行SET datestyle;
(对于最常用的样式),并避免所有过多的格式化。
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE SYS_FEED
( USERID INTEGER NOT NULL PRIMARY KEY
, GRANTDATE DATE NOT NULL
, REVOKEDATE DATE NOT NULL
, feedname varchar
);
INSERT INTO SYS_FEED(USERID, GRANTDATE, REVOKEDATE, feedname)
SELECT sv
, date('2005-01-01') + sv
, date('2006-01-01') + sv
, 'silent_' || sv::text
FROM generate_series( 1,1000) sv
;
CREATE TABLE PRINCIPLE
( ID INTEGER NOT NULL PRIMARY KEY
, SURNAME varchar
);
INSERT INTO PRINCIPLE(ID,SURNAME)
SELECT val
, 'SHOUT_' || val::text
FROM generate_series( 1,1000) val
;
DELETE FROM SYS_FEED WHERE random() < 0.9;
DELETE FROM PRINCIPLE WHERE random() < 0.9;
-- EXPLAIN ANALYZE
SELECT P.SURNAME
, to_char(SFE.GRANTDATE, 'DD Mon YY') AS GRANTDATE
, to_char(SFE.REVOKEDATE, 'DD Mon YY') AS REVOKEDATE
, SFE.feedname AS DONTSHOUTNAME
FROM SYS_FEED SFE
JOIN PRINCIPLE P ON SFE.USERID = P.ID
WHERE GRANTDATE < '2006-12-01'
;
结果:
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "sys_feed_pkey" for table "sys_feed"
CREATE TABLE
INSERT 0 1000
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "principle_pkey" for table "principle"
CREATE TABLE
INSERT 0 1000
DELETE 901
DELETE 904
surname | grantdate | revokedate | dontshoutname
-----------+-----------+------------+---------------
SHOUT_53 | 23 Feb 05 | 23 Feb 06 | silent_53
SHOUT_173 | 23 Jun 05 | 23 Jun 06 | silent_173
SHOUT_308 | 05 Nov 05 | 05 Nov 06 | silent_308
SHOUT_337 | 04 Dec 05 | 04 Dec 06 | silent_337
SHOUT_531 | 16 Jun 06 | 16 Jun 07 | silent_531
SHOUT_543 | 28 Jun 06 | 28 Jun 07 | silent_543
SHOUT_566 | 21 Jul 06 | 21 Jul 07 | silent_566
(7 rows)