zoukankan      html  css  js  c++  java
  • 关于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个字了也不允许我发╮(╯_╰)╭,我就凑一下字数,不要介意啊啊啊啊啊啊啊啊~~~




  • 相关阅读:
    归并两路有序链表
    [转]两种高性能I/O设计模式(Reactor/Proactor)的比较
    linux 静态库使用经验
    系统性能调优经验
    编译-O 选项对性能提升作用
    [转]Linux shell中的那些小把戏
    shell函数传递带空格的参数
    标题清洗引发的算法(两个字符串的最长公共子串)
    正则表达式之Matcher类中group方法
    ConcurrentHashMap JDK 1.6 源码分析
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5607906.html
Copyright © 2011-2022 走看看