大多数情况下需要存储年月字段时,首先想到的方法如下:
create table a(
year int not null,
month int not null,
...
constraint pk_a_objectid primary key(year,month)
)
类似的需求一个int字段就可以完成,其中高字节16位存储年份,低字节16位存储月分, 年份最多可以存储到32768年,月份1-12不会变动.例如:2018年2月,其中2018十六进制为0x07E2,2十六进制为0x0002,合并后结果为0x07E20002,转换为十进制后为132251650
create table a(
ym int not null,
...
constraint pk_a_objectid primary key(ym)
)
验算
--存储2018年2月
select 2018<<16 | 2
output:132251650
--注意2018年的数据范围为132251649-132251660,2019年的数据范围为132317185-132317196以此类推
--反算回来
select 132251650 >> 16,(132251650 << 16)>>16
--查2018年度的数据
select * from a where ym > (2018<<16) and ym < (2019<<16)
位运算是计算机最基本的算法,效率非常高,因此不用担心运算速度问题.