关于年月字段的存储

大多数情况下需要存储年月字段时,首先想到的方法如下:

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)

位运算是计算机最基本的算法,效率非常高,因此不用担心运算速度问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值