sql server 2000日期转化注意问题

本文揭示了SQL Server在处理未正确格式化的日期时可能出现的意外结果。通过实例演示了当日期被误认为数值时,如何导致计算出错误的日期值,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日期转化过程中,往往会出现一些认人匪夷所思的结果,比如下面这段代码:
declare @date datetime
set @date=2007-10-04
select @date

------
结果
1905-06-17 00:00:00.000
---------------
这和预期结果2007-10-04有很大差距,具体原因是为什么呢.原来,在这里SQL server处理@date的时候是把它作为了数字.因为没有找到单引号,所以就做了减法处理2007-10-4=1993.但1993怎么又变成1905-06-17呢?
大家都知道SQL server是以1900-01-01做为基础日期的.10月4日20时34分 存储的长度为八个字节,日期和日间各用四个字节存储,第一个四字节存储自1900-01-01之前或之后的天数,后四个字节存储以午夜00:00:00.000后的毫秒数.而此处呢?SQL server则把1993看做是在基础日期上加上1993天,即上面的结果.同样小数部分也可以换算.不过是换算成时间.比如在1993后面加上0.158即:1993.158.
1993转换为天,0.158不到一天,则可以换算出毫秒数:24*60*60*1000*0.158,即:13651200.000

select dateadd(ms,13651200,'00:00:00.000')
-------------
结果
1900-01-01 03:47:31.200
-------------
再对这个结果加上1993天
select dateadd(day,2007-10-04,dateadd(ms,24*60*60*1000*0.158,'00:00:00.000'))
------------
结果
1905-06-17 03:47:31.200
--------------
所以,在定义datetime类型的时候一定要注意加上界定符.另外,在dateadd(day,1.1,getdate())这种写法中,小数部分是无效的,也不会做四舍五入处理.当然用dateadd(ms,24*60*60*1000*1993.0158,getdate())也是行不通的.因为毫秒计算的最大数为:24天20小时31分23.647秒.用秒的说也只有68年,超过此值则会出错.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值