【发布时间】:2016-08-12 14:12:19
【问题描述】:
有没有办法告诉 SlamData 一周从星期一开始(就像在德国一样)?
想要GROUP BY DATE_PART("week", c.createdAt) 这总是错误的,因为 SlamData 的一周比我们早一天开始。
在某些数据库系统中,您可以“SET DATEFIRST 1”来解决这个问题,但这里不行。
【问题讨论】:
有没有办法告诉 SlamData 一周从星期一开始(就像在德国一样)?
想要GROUP BY DATE_PART("week", c.createdAt) 这总是错误的,因为 SlamData 的一周比我们早一天开始。
在某些数据库系统中,您可以“SET DATEFIRST 1”来解决这个问题,但这里不行。
【问题讨论】:
SQL 对“一年中的一周”的定义似乎与 MongoDB 的发生冲突。
根据定义,ISO 周从星期一开始,一年的第一周包含该年的 1 月 4 日。
而MongoDB 有这个:
周从星期日开始,第 1 周从一年中的第一个星期日开始...这种行为与 strftime 标准库函数的“%U”运算符相同。
Quasar(SlamData 背后的查询引擎)在这种情况下直接使用 MongoDB 运算符,所以这就是您将看到的行为。
我怀疑可以从另一个中获取一个,这是 Quasar 应该做的,我鼓励你写一个 github 问题报告这个错误:https://github.com/quasar-analytics/quasar/issues。
也应该可以在 SQL 中表达相同的修复作为一种解决方法,但它不太可能是漂亮的。如果 我 最终修复了 Quasar 中的错误,我会用我想出的公式更新这个答案。
【讨论】:
您可以使用 SQL CASE 表达式来达到您想要的效果:
GROUP BY
(CASE DATE_PART("week", c.createdAt)
WHEN 1 THEN 7
WHEN 2 THEN 1
WHEN 3 THEN 2
WHEN 4 THEN 3
WHEN 5 THEN 4
WHEN 6 THEN 5
WHEN 7 THEN 6
END)
这会将星期日转移到一周的最后一天。
【讨论】: