【问题标题】:Extracting entries from a specific month in SQL从 SQL 中的特定月份提取条目
【发布时间】:2021-04-02 18:27:52
【问题描述】:

我正在尝试从名为 orders 的表中计算 3 月份每个客户购买的总收入,其中 order_date 的格式为 datetime(例如 2019-03-04)。但是,我无法通过以下任一选项获得结果:

WITH cte_orders AS
(
    SELECT
        cust_id,
        SUM(order_quantity * order_cost) AS revenue
    FROM
        orders
    WHERE 
        DATEPART('month', order_date) = 3
    GROUP BY 
        cust_id
)
SELECT cust_id, revenue 
FROM cte_orders;

还有

WHERE EXTRACT(month from order_date) = '03'

WHERE MONTH(order_date) = 03

也不行。我这里的语法有什么问题?

【问题讨论】:

  • 您确定 order_date 被视为日期时间对象吗?尝试将其投射到前行,看看是否是问题所在。只是一个想法,语法和逻辑对我来说似乎是正确的。
  • 你使用什么 rdbms?
  • @snr PostgreSQL
  • 能否提供minimal reproducible example,以便我们更好地理解问题
  • 可能更容易提供该链接。但是我必须创建一个帐户才能使用它;我不想要的帐户。在此处提供minimal reproducible example 或创建fiddle。请记住,社区越难,您获得和回答的可能性就越小。

标签: sql postgresql datetime extract


【解决方案1】:

感谢大家的意见,终于找到了正确的方法:

WITH cte_orders AS
(
    SELECT 
        cust_id,
        SUM(order_quantity * order_cost) AS revenue,
    FROM 
        orders
    WHERE
        EXTRACT('MONTH' FROM order_date :: TIMESTAMP) = 3
    GROUP BY
        cust_id
)

SELECT cust_id, revenue 
FROM cte_orders;

这样,它将日期转换为时间戳并根据需要提取三月。

【讨论】:

  • 我能够使用date_part 运行代码,而无需将order_date 转换为TIMESTAMP 或DATE。 WHERE date_part('MONTH', order_date) = 3
【解决方案2】:

date_part 呢?

WITH cte_orders AS
(select cust_id
    , SUM(order_quantity * order_cost) as revenue
from orders
WHERE date_part('month',TIMESTAMP order_date) = 3
group by cust_id)

select cust_id, revenue from cte_orders;

【讨论】:

  • 还是什么都没有,我检查了 order_date 是否真的显示为 datetime,我在stratascratch 平台上执行此操作作为练习,由于某种原因, date_part() 和 month() 函数都没有在密码箱。我相信任务要我使用 extract() 函数,但是 WHERE EXTRACT(month from order_date) = '03' 仍然不起作用。
  • WHERE date_part('MONTH', order_date) = 3 有效。我认为上面的语法是关闭的。
【解决方案3】:

您是否考虑将 WHERE 子句放在 CTE 之外?

WITH cte_orders AS
(
    SELECT
        cust_id,
        SUM(order_quantity * order_cost) AS revenue
    FROM
        orders
    WHERE 
        DATEPART('month', order_date) = 3
    GROUP BY 
        cust_id
)
SELECT cust_id, revenue 
FROM cte_orders
WHERE MONTH(order_date) = 03;

此外,如果您让我们知道您获得了什么(如果有的话)结果,将会很有帮助。您是收到错误消息还是只是没有返回预期值/行数?

【讨论】:

  • 应该是date_part,因为它是postgres
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多