关于datetime 和 int 之间相互转换

在其他地方看到一个有点意思的东西。是记录转换规则的。

DECLARE @Date1 DATETIME = '2016-06-21 11:53:00'
      , @Date2 DATETIME = '2016-06-22 13:25:00'
 
SELECT 
  DATEDIFF(day, @Date1, @Date2)
, CAST(@Date2 - @Date1 AS INT)
, CAST(@Date2 AS INT) - CAST(@Date1 AS INT)
, CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT)

求每个值输出的结果是多少,我没多想,直接得出

DATEDIFF(day, @Date1, @Date2)   1 
, CAST(@Date2 - @Date1 AS INT)  1
, CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 1
, CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT) 1 

结果放在ssms上面执行,在这个部分答案出错了
CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 2

下面是解释过程
关于datetime 的数值存储,数值部分是从1900-01-01 00:00:00 开始计算的,整数部分保存和这个日期差异的天数,小数部分记录是该时间在一天里面的比例。

DATEDIFF(day, @Date1, @Date2)  结果是1不是2(不是已经多了1天有多吗?) 关于这个函数,对于day 的差值,只会精确到 day这这一层,即只对比年月日这3项。加入datediff 的参数是Month 那么,比对的项只有年和月,以此类推。所以说虽然看起来超过了一天,但是相减转换成int也是1
CAST(@Date2 - @Date1 AS INT)  1 日期的运算同上面一样。而且datetime 转换成数字也只会比对日期部分,所以答案就是1
CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 2 这个就要看 cast 的转化了。对于这个例子,把日期转换成int 虽然只是跟日期部分有关,但是。这里有个特殊的地方是只要时间部分超过了12点,就会+1(相当于四舍五入),所以答案是2
CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT) 1  这里先转化成浮点,然后相减之后转换成int ,转成浮点的时候,小数位就是计算时间部分占一天的比例。这样看相减是比1多1点,燃鹅最后转换成int ,就把小数位抹掉,就是1了


这个题目虽然简单,但是也有一些我们平时使用的一些小细节,考察着我们开发人员对这些小点的关注,如果不注意的话还是有可能平时使用出现意想不到的状况的。有时候不注意,查询报表或者写语句就很容易出现什么数位溢出,转换失败之类的东东了。
这个确实要靠平时多注意,尽量少踩坑。
PS:如果说得不好或者理解有误,欢迎各位拍砖
最后我也不知道为什么,我已经超过150个字了也不允许我发╮(╯_╰)╭,我就凑一下字数,不要介意啊啊啊啊啊啊啊啊~~~




 

posted on 2016-06-22 17:21  神崎橙  阅读(9367)  评论(0编辑  收藏  举报

导航