语句 · 2026 年 6 月 11 日 · 9 分钟
日期函数没有世界语
同样是「本月」,PostgreSQL、MySQL、仓库引擎的函数名和周起始日都可能不同。问数不把日期函数当世界语。能写绝对时间戳,就少用一次方言魔法。公开提问建议把相对时间算成绝对区间,也是在躲这件事。
优先绝对区间
DATE '2026-03-01' 到 DATE '2026-04-01' 最稳。
必须用相对时注明引擎
卡片上写「按 PostgreSQL」。
周和财年
这两样最不能靠默认。写死。
一次完整的问法可以先写成下面这样:
用绝对区间表达 2026 年 3 月,避免方言日期函数。
落到语句上,草稿常常是:
SELECT SUM(pay_amount) AS gmv
FROM orders
WHERE pay_time >= TIMESTAMP '2026-03-01 00:00:00'
AND pay_time < TIMESTAMP '2026-04-01 00:00:00';
绝对区间丑一点,跨引擎时少吵架。丑是收据该有的质地。
语句是收据,默认只读
第一纪律是 SELECT。草稿里出现更新、删除、结构变更,整张收据作废。第二纪律是时间窗。大表没有时间条件,不跑。第三纪律是粒度。GROUP BY 的键必须和问题里的维度一一对应。
一对多关联会把头上的金额按明细复制,看起来像增长,其实是扇形。COUNT 和 COUNT DISTINCT 不是同一指标。NULL 不是 0。日期函数没有世界语,能写绝对区间就写绝对区间。
复杂逻辑用公共表表达式拆开。拆开是为了给人看中间结果。先对再快。用索引去救一条口径错误的语句,会把错误生产化。
读完这一辑可以做什么
把你最近一条问数语句拆成三段 WITH:过滤、聚合、排名。每一段单独跑。有一段解释不清,就回到提问,不要在语句里继续加花样。
绝对区间丑一点,换引擎时少吵架。