关于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个字了也不允许我发╮(╯_╰)╭,我就凑一下字数,不要介意啊啊啊啊啊啊啊啊~~~
				
时间: 2024-10-21 02:33:46

关于datetime 和 int 之间相互转换的相关文章

C++ 中 int,char*,string,CString之间相互转换-整理

#include <string> //使用C++标准库的string类时 using namespace std; //同上 #include <sstream> #include <iostream> #include <stdlib.h> //要将string类和int类型直接转换最好有这些包含, //因为自己写一个转换函数比较方便,函数定义参考如下 string getstring ( const int n ) { std::stringstrea

bigdecimal 与long int 之间转换

BigDecimal与Long.int之间的互换 在实际开发过程中BigDecimal是一个经常用到的数据类型,它和int Long之间可以相互转换. 转换关系如下代码展示: int 转换成 BigDecimal 数据类型 //int  转换成  bigDecimal类型 public static void intToBigDecimal(){ int b = 5; BigDecimal a = new BigDecimal(b); System.out.println(a +"的数据类型是&

NSNumber和Int之间的转换

int 转 NSNumber: [NSNumber numberWithInt:(int)]; NSNumber 转 int [(NSNumber) intValue]; 其他数据类型类似 有些数组只能存Object对象,所以需要将普通数据类型转换成为Object型. NSNumber和Int之间的转换,布布扣,bubuko.com

php中 xml json 数组 之间相互转换

php中 xml json  数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, 'data'=>$data, ); json_encode($result);

无法确定条件表达式的类型,因为Datetime和&lt;null&gt;之间没有隐式转换

Q: var a=isFilter ? ta.EndDate : null; Error:无法确定条件表达式的类型,因为Datetime和<null>之间没有隐式转换 ta.EndDate是DateTime类型,不能与null选择: A: var a=isFilter ? ta.EndDate : (DateTime?)null;//加在ta.EndDate也是可以的.

java基础巩固系列(二):Integer与int之间的区别

在JDK1.5之后引入了自动装箱(autoboxing)与自动拆箱(unboxing),这让很多对java的初学者感到很疑惑,我刚才也是其中一员. 首先,有一些基本的概念需要了解: 1.Ingeter是int的包装类,int的初值为0,Ingeter的初值为null. 2.Integer是一个类,用Integer声明一个变量是一个对象类型(或者说引用类型):int是基本类型,用int声明的变量是非对象类型,即不能在其上调用方法. 3."=="作用于对象上的时候,其比较的是对象的引用本身

HTML(DOM)与JavaScript嵌套数组之间相互转换

1. [代码][JavaScript]代码     /*<html><head>  <title>HTML RESTructure</title><style></style><script>*/// workDOM函数遍历目标元素或节点// 有两种模式://   1. `element`模式(默认)(包含所定义的元素项)//   2. `node`模式(包含文本节点在内的所有节点)function walkDOM(mod

string,char*,int 之间的转化

c++中经常遇到string,char*,int之间的相互转化,今天就来整理一下. 以下是转载并修改的内容: 以下是常用的几种类型互相之间的转换 string 转 int先转换为char*,再使用atoi()函数,具体如下 .............................. char* 转 int #include <stdlib.h> int atoi(const char *nptr); long atol(const char *nptr); long long atoll(c

WebService(2)-XML系列之Java和Xml之间相互转换

源码下载:链接:http://pan.baidu.com/s/1ntL1a7R 密码: rwp1 本文主要讲述:使用jaxb完成对象和xml之间的转换 TestJava2xml.java如下所示: package com.tgb.jaxb.v1; import java.io.StringReader; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Mar