我试图找到两个瞬间物体之间的月份差异。我做了如下:
SQL> with
2 kpol (sifra_rad, dat_izd) as
3 (select '7654' , date '2009-01-01' from dual union all
4 select '00547', date '2013-03-01' from dual union all
5 select '00214', date '2013-03-01' from dual union all
6 select '00547', date '2013-04-01' from dual union all
7 select '00654', date '2013-04-04' from dual
8 ),
9 sifrad (sifra_r, ime) as
10 (select '00214', 'Test123' from dual union all
11 select '00547', 'Aladin' from dual union all
12 select '00654', 'Test' from dual union all
13 select '0214' , 'AbBbCc' from dual
14 )
15 select p.sifra_rad,
16 s.ime,
17 p.dat_izd
18 from kpol p join sifrad s on p.sifra_rad = s.sifra_r
19 where extract (year from p.dat_izd) = 2013
20 order by p.sifra_rad;
SIFRA IME DAT_IZD
----- ------- ----------
00214 Test123 01.03.2013
00547 Aladin 01.04.2013
00547 Aladin 01.03.2013
00654 Test 04.04.2013
SQL>
const current = moment()
const future = moment().add('324523546345634563456345','months')
const diff = future.diff(current, 'months')
的值为0。为什么?有没有其他方法可以处理像diff
这样的大数字?
答案 0 :(得分:3)
简短的回答:您的输入超出了JavaScript内置的整数和日期类型的限制。要使用如此大的数字进行计算,请使用类型BigInt
。 (像MomentJS这样的大多数日期库都不支持BigInt
,原因之一是正整数提供了合理的日期范围。)
JavaScript内置数字可以表示的最大整数是9,007,199,254,740,991。浮点数要高得多,但对于这种类型的用例来说可能没有意义(浮点间隙太多)。
您的输入:324,523,546,345,634,563,456,345比JavaScript内置整数支持的输入大许多数量级。在将月份转换为毫秒之后,甚至还没有考虑其他数量级。
坦率地说,我很惊讶结果为0而不是NaN
。
此外,我相信MomentJS在内部使用内置的JavaScript Date类型。最长日期约为year 275,760。您的意见将需要一年的支持,直到今年为止。实际上,您的输入大于the age of the universe。
如果您确实需要进行这样的计算,则可以使用BigInt
s。您可能必须手动进行计算,因为我认为没有任何与时间相关的库都支持这么大的日期。