2014-03-18 44 views
1

我試圖只有SELECT行(其中expiry_date(類型時間戳帶時區)不超過30天小於current_date(即失效日期爲30天)。WHERE expiry_date>(current_date - 30 * interval'1 day')

我以爲這是工作(注:寫一個更好的測試用例!),但顯然不是。 CLI中的一些測試未返回預期結果。

第一個查詢抓取單個行(詳細信息頁面),第二個抓取多個行(分頁視圖)。

SELECT * 
FROM listings 
WHERE id = $1 AND expiry_date > (current_date - $2 * interval '1 day') 

(給出一個ID($ 1),返回該行,如果到期日不大於30($ 2)天)。

SELECT * 
FROM listings 
WHERE expiry_date > (current_date - $1 * interval '1 day') 
ORDER BY expiry_date DESC OFFSET $2 LIMIT $3 

(給定的偏移量($ 2),返回未過期的行中,以限制($ 3)。在默認的情況下,這些分別爲0和15日)。

  • 當運行一個具有EXPIRY_DATE在過去連續第一個查詢(即2014年3月8日05:15:44.236747 + 00),它仍然返回該行

    SELECT id, expiry_date FROM listings where id = '96144752ad41b6bf' AND expiry_date > (current_date - 30 * interval '1 day'); 
    ____________________________________________________ 
    _  id  _   expiry_date   _ 
    ____________________________________________________ 
    _ 96144752ad41b6bf _ 2014-03-09 02:33:25.855162+00 _ 
    ____________________________________________________ 
    (1 row) 
    
  • 當運行第二個查詢時,我得到了兩個過期的行和未過期的行的混合。

    SELECT id, expiry_date FROM listings WHERE expiry_date > (current_date - 30 * interval '1 day') ORDER BY expiry_date DESC OFFSET 0 LIMIT 15; 
    ____________________________________________________ 
    _  id  _   expiry_date   _ 
    ____________________________________________________ 
    _ 333b0291f8e357b9 _ 2014-04-04 21:40:14.744937+00 _ 
    _ 975d2a671ab577dd _ 2014-03-26 03:47:21.872271+00 _ 
    _ af35cbc3b2f6189b _ 2014-03-25 04:43:23.78521+00 _ 
    _ 3c3658ecceafde4b _ 2014-03-23 14:24:08.023696+00 _ 
    _ 931c2d5795705b5b _ 2014-03-10 15:43:52.05335+00 _ 
    _ eddb3711f02a0ad0 _ 2014-03-10 02:38:53.754079+00 _ 
    _ e2814251618590db _ 2014-03-09 14:06:07.829742+00 _ 
    _ 96144752ad41b6bf _ 2014-03-09 02:33:25.855162+00 _ 
    _ 1dbdcd6cb2cc6e7f _ 2014-03-08 05:58:52.121108+00 _ 
    _ d25d1b06b9e69f3e _ 2014-03-08 05:52:37.887371+00 _ 
    _ c52aa23d79583033 _ 2014-03-08 05:17:09.683484+00 _ 
    _ 56e9f4cdca899a40 _ 2014-03-08 05:15:44.236747+00 _ 
    _ 302f0226b7b33f05 _ 2014-03-08 05:09:43.909115+00 _ 
    _ edc45b7ca32f69f5 _ 2014-03-07 14:13:51.366852+00 _ 
    _ 90c1ef396073ff28 _ 2014-03-07 13:04:12.250061+00 _ 
    ____________________________________________________ 
    (15 rows) 
    

爲背景,在我的web應用程序UTC時間戳產生的日期;通過向created_date時間戳添加X天(通常30)插入之前設置expiry_date。

我在這裏錯過了什麼?

+2

什麼是第一個查詢中的「$ 2」和第二個中的「$ 1」? –

+1

當您詢問意外結果時,您需要顯示與查詢相對應的數據。也許http://sqlfiddle.com/在這裏很有用。 –

+0

也許你的expiry_date列有一個設置爲意外事件的時區。另外,直接使用參數* as *日數量:'expiry_date>(current_date - interval'$ 2 day')' – Bohemian

回答

2

結果正是我所期望的。

http://sqlfiddle.com/#!15/d110a/3

我覺得你的問題是一個查詢的定義。您說:

其中expiry_date(類型帶時區的時間戳)比current_date(即過期日期爲30天)少不到30天。

這並不清楚。你想要什麼?行期限不到三十天的行?行沒有過期,但由於在30天內過期?不會在30天內過期的行?

您當前的查詢會查找已過期或將在30天內過期的行,即當前日期減去三十天的行數小於到期日期的行數。

regress=> SELECT current_date, (current_date - 30 * interval '1 day'), expiry_date 
regress-> FROM listings 
regress-> WHERE id = '96144752ad41b6bf'; 
    date |  ?column?  |   expiry_date   
------------+---------------------+------------------------------- 
2014-03-19 | 2014-02-17 00:00:00 | 2014-03-09 10:33:25.855162+08 
(1 row) 
2

如果只希望過期的行,則必須在查詢中指明該行。在你的例子中,你選擇的有效日期爲以後的的行比現在要早30天;所有未來的到期日也因此返還。試試這個:

SELECT * 
FROM listings 
WHERE expiry_date > (current_date - $1 * interval '1 day') 
    AND expiry_date < now() 
ORDER BY expiry_date DESC OFFSET $2 LIMIT $3