有一个表:
CREATE TABLEASSET(
ASSET NUMERIC ,
REAL NUMERIC ,
TIMESTAMP NUMERIC ,
TIMESTRING VARCHAR(100)
)
其中的TIMESTAMP 是NUMERIC 类型,实际存放的是UNIX Time,
可是有一次在做查询时发现一个问题:
SELECT * FROM ASSET where TIMESTAMP = 16461*1000*60*60*24;
单独试一下
select 16461*1000*60*60*24;
还是溢出,看来16461*1000*60*60*24就不行啊,但是这个是完全没有问题的,再试:
select 1422253516184/1000/60/60/24;
16461 |
---|
16461 |
这个可以,怎么回事?
为什么除可以,乘法就不可以?
再试一下:
select 1422253516184/1422253516184*16461*1000*60*60*24;
1422230400000 |
---|
1422230400000 |
竟然可以了,相信到这里大家也明白了,h2默认使用第一个变量的类型储存结果,越算越大就溢出了,如果初始化一个大类型,则可以解决此问题。
再实际查询一下:
SELECT * FROM ASSET where TIMESTAMP = 1422253516184/1422253516184*16461*1000*60*60*24;
ASSET | REAL | TIMESTAMP | TIMESTRING |
---|
果然OK。
我用的h2是1.3.176,不知道后续版本是否有相同的问题。