是否有类似于 MonetDB 中的 DateDiff 的函数可以计算两个日期之间的周数

问题描述

考虑两个日期,“2011 年 1 月 1 日”和“2011 年 10 月 1 日”。 我想计算这些日期之间的周数。

我尝试了以下方法

select extract ( week from ( (current_date+ interval '5' day) - current_date ));
  • 它返回错误“没有这样的一元运算符 'week(day_interval)'”

我可以使用以下方法找到天数:

select extract ( day from ( (current_date+ interval '5' day) - current_date )); 

有什么办法可以达到同样的目的吗?

此外,monetdb 考虑从星期一到星期日(1-7)的一周。有什么办法可以更新/定制到周日到周六。

谢谢。

解决方法

我能想到的有几种可能性:

select date '2011-10-01' - date '2011-01-01';

产生一个 INTERVAL DAY 值,实际以秒数表示,即 23587200.000。这可以除以 (72460*60),即一周中的秒数。但它仍然是 INTERVAL 类型,而不是 INTEGER。

另一种方法是先将日期转换为整数:自“纪元”(1970 年 1 月 1 日)以来的秒数:

select epoch_ms(date '2011-10-01');

这实际上给出了自纪元以来的毫秒数,因此额外的因子为 1000。

你可以操纵这个结果来得到你想要的:

select (epoch_ms(date '2021-02-02') - epoch_ms(date '2020-12-31')) / (7*24*60*60*1000);

这会产生一个 HUGEINT 值(如果您的系统中有 128 位整数,即使用 GCC 或 CLANG 编译的任何内容),因此您可以将其转换为 INTEGER:

select cast((epoch_ms(date '2011-10-01') - epoch_ms(date '2011-01-01')) / (7*24*60*60*1000) as integer);