文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» 微软SQL Server专区 » SQL Server应用开发 » sql server 2000日期转化注意问题       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: sql server 2000日期转化注意问题  ( 查看:546  回复:1 )   
 
boyi55
副版主  点击可查看详细


诚信兄弟   天秤座  
帖子 918
精华 1
无忧币 3898
积分 959
阅读权限 140
来自 (保密)
注册日期 2006-1-12
最后登录 2008-10-7 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ       
发表于:2007-10-4 20:51   标题:sql server 2000日期转化注意问题
上一帖 |
在日期转化过程中,往往会出现一些认人匪夷所思的结果,比如下面这段代码:
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年,超过此值则会出错.



春江潮水连海平/海上明月共潮生/滟滟随波千万里/何处春江无月明!
2007-10-4 20:511楼
[ 顶部 ]
 
xjl520
技术员  点击可查看详细



帖子 417
精华 0
无忧币 684
积分 479
阅读权限 30
注册日期 2007-9-17
最后登录 2008-10-4 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-10-5 09:21 
be ignorant of



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-10-5 09:212楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号