首页 > 解决方案 > MonetDB中是否有类似于DateDiff的函数可以计算两个日期之间的周数

问题描述

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

我尝试了以下方法:

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

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

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

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

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

谢谢。

标签: monetdb

解决方案


我能想到几种可能性:

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

产生一个 INTERVAL DAY 值,实际上以秒的差异表示,即 23587200.000。这可以除以 (7 24 60*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);

推荐阅读