Postgres中WHERE子句用TO_CHAR查询财年数据无结果求助
问题原因与解决方案
问题根源
你将日期转换为MM/DD/YYYY格式的字符串后进行比较,而字符串是按字符顺序逐位对比的:
'06/30/2022'的前两位是'06','07/01/2021'的前两位是'07',字符串比较中'06' < '07',所以TO_CHAR(...) >= '07/01/2021' AND TO_CHAR(...) <= '06/30/2022'的条件永远不成立,自然没有结果。- 改成
'07/30/2022'后,前两位'07'与'07/01/2021'的前两位匹配,符合条件的字符串会被筛选出来,因此能得到结果。
正确写法
方式1:直接用日期类型比较(推荐)
避免转换为字符串,直接对日期类型做逻辑比较,既准确又能利用字段索引提升性能:
WHERE aa.timestamp::date >= '2021-07-01'::date AND aa.timestamp::date <= '2022-06-30'::date
方式2:通用财年统计写法
如果需要统计任意财年(每年7月1日至次年6月30日),可以用以下更灵活的写法:
-- 示例:统计2022财年(2021-07-01 ~ 2022-06-30)的数据 WHERE EXTRACT(YEAR FROM aa.timestamp + INTERVAL '6 months') = 2022
逻辑说明:将日期加6个月后,得到的年份即为财年年份,完美覆盖整个财周期。
内容的提问来源于stack exchange,提问作者2ToneTim
相关产品推荐
相关产品推荐

