【问题标题】:Postgres between dates does not select the right dates日期之间的 Postgres 没有选择正确的日期
【发布时间】:2016-03-09 15:51:05
【问题描述】:
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,它会正常工作。

【问题讨论】:

    标签: postgresql between


    【解决方案1】:

    我想你的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
    

    但在您的实际查询中可能还有更多内容。

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2017-04-19
      相关资源
      最近更新 更多