问题描述
考虑两个日期,“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);