日期之间的Postgres不会选择正确的日期

时间:2016-03-09 15:51:05

标签: postgresql between

SELECT 
   COUNT(create_user_id)::int AS y, 
   x
FROM
(
    SELECT 
        create_user_id, create_time::abstime::date AS x
    FROM 
        table1 AS s
    WHERE
    (
        create_user_id = 16
        OR
        update_user_id = 16
    )
    AND
    (
        CASE WHEN create_user_id = 16 THEN 
                TIMESTAMP 'epoch' + create_time * INTERVAL '1 second'
                BETWEEN 
                    '2015-03-09'
                AND
                    '2016-03-09'
             WHEN update_user_id = 16 THEN 
                TIMESTAMP 'epoch' + update_time * INTERVAL '1 second'
                BETWEEN 
                    '2015-03-09'
                AND
                    '2016-03-09'
        END
    )
) AS res
GROUP BY x ORDER BY x

输出

{
 235;"2014-11-29"
 48;"2014-12-11"
  8;"2014-12-12"
 55;"2014-12-13"
  8;"2014-12-16"
 49;"2014-12-17"
  9;"2014-12-18"
 13;"2014-12-19"
 21;"2014-12-21"
 18;"2016-02-22"
 29;"2016-02-23"
  4;"2016-02-27"
 21;"2016-02-28"
}

第一个版本是

SELECT 
 COUNT(create_user_id)::int AS y, 
 x
FROM
(
    SELECT 
        create_user_id, create_time::abstime::date AS x
    FROM 
        table1 AS s
    WHERE
    (
        create_user_id = 16
        OR
        update_user_id = 16
    )
    AND
    (
        CASE WHEN create_user_id = 16 THEN 
                create_time
                BETWEEN 
                    1449612000
                AND
                    1457474400 
             WHEN update_user_id = 16 THEN 
                update_time
                BETWEEN 
                    1449612000
                AND
                    1457474400 
        END
    )
) AS res
GROUP BY x ORDER BY x

我的问题是为什么列表以2014-11-29开头,以及我如何修复它。我尝试过不同的数据格式,例如09.03.2015

如果我删除WHEN update_user_id = 16.....AND 1457474400,那么它的工作原理应该如此。

1 个答案:

答案 0 :(得分:0)

我想也许你对WHERE声明有点过分了。它可能只是:

SELECT COUNT(create_user_id)::INT AS y,
    x
FROM (
    SELECT create_user_id,
        create_time::abstime::DATE AS x
    FROM table1 AS s
    WHERE (
            create_user_id = 16
            AND TIMESTAMP 'epoch' + create_time * INTERVAL '1 second' BETWEEN '2015-03-09'
                AND '2016-03-09'
            )
        OR (
            update_user_id = 16
            AND TIMESTAMP 'epoch' + update_time * INTERVAL '1 second' BETWEEN '2015-03-09'
                AND '2016-03-09'
            )
    ) AS res
GROUP BY x
ORDER BY x

似乎可以简化这一点,因为不需要子查询:

SELECT 
    COUNT(create_user_id)::INT AS y,
    create_time::abstime::DATE AS x 
FROM table1 AS s
WHERE (
        create_user_id = 16
        AND TIMESTAMP 'epoch' + create_time * INTERVAL '1 second' BETWEEN '2015-03-09'
            AND '2016-03-09'
        )
    OR (
        update_user_id = 16
        AND TIMESTAMP 'epoch' + update_time * INTERVAL '1 second' BETWEEN '2015-03-09'
            AND '2016-03-09'
            )       
GROUP BY x
ORDER BY x

但也许您的真实查询还有更多内容。