sql server 2000日期转化注意问题

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
在日期转化过程中,往往会出现一些认人匪夷所思的结果,比如下面这段代码:
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年,超过此值则会出错.









本文转自 boyi55 51CTO博客,原文链接:http://blog.51cto.com/boyi55/45063,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
SQL 程序员
【Sql Server】来一波日期和时间函数,看看是否都知道
本篇文章主要了解下日期和时间函数,当前时间的前两天等设置
88 0
【Sql Server】来一波日期和时间函数,看看是否都知道
|
SQL Go 数据库
SQLServer数据库获取重复记录中日期最新的记录
在日常的项目开发当中,经常会遇到获取同一属性相同的记录,如何获取记录时间最新的那一条,比如获取某个淘宝用户最新一次的购物记录,美团外卖获取用户最后一次的点外卖记录等等场景,下面通过简单的示例给大家提供三种比较常见的SQL写法,希望能给大家带来一些思路。
SQLServer数据库获取重复记录中日期最新的记录
|
SQL
SQLServer 随机生成指定范围的日期
一个分页的问题,DTCms3.0中,分页是根据时间分页的,如果当添加时间(add_time)都是同一个数值时,不管点击第几页,显示的数据都是同一个的内容,于是就有了需要把同一个时间改指定随机日期的功能。
1288 0
|
SQL
Sql Server函数全解<四>日期和时间函数
原文:Sql Server函数全解日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分。
1266 0
|
SQL XML BI
在Sqlserver下巧用行列转换日期的数据统计
原文:在Sqlserver下巧用行列转换日期的数据统计                  在Sqlserver下巧用行列转换日期的数据统计   前言     在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法。
1251 0
|
SQL Serverless C#
SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)
原文:【转】SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等) 在网上找到的一篇文章,相当不错哦O(∩_∩)O~ //C#本周第一天            int dayOfWeek = Convert.
1315 0
|
SQL 数据库连接 API
SqlServer中日期和时间数据类型及函数 【转】
来源:http://blog.csdn.net/royalwzy/article/details/6446075     日期和时间数据类型 下表列出了 Transact-SQL 的日期和时间数据类型.
1119 0