SQL Server中datetimeset转换类型为datetime有哪些方法
Admin 2022-07-02 群英技术资讯 508 次浏览
在SQL Server中,数据类型datetimeoffset转换为datetime类型或datetime2类型时需要特别注意,有可能一不小心你可能会碰到下面这种情况。下面我们构造一个简单案例,模拟一下你们可能遇到的情况。
CREATE TABLE TEST ( ID INT IDENTITY(1,1) ,CREATE_TIME DATETIME ,CONSTRAINT PK_TEST PRIMARY KEY(ID) ); GO INSERT INTO TEST(CREATE_TIME) SELECT '2020-10-03 11:10:36' UNION ALL SELECT '2020-10-03 11:11:36' UNION ALL SELECT '2020-10-03 11:12:36' UNION ALL SELECT '2020-10-03 11:13:36'; DECLARE @p1 DATETIMEOFFSET; SET @p1='2020-10-03 11:12:36.9200000 +08:00' SELECT * FROM dbo.TEST WHERE CREATE_TIME <=@p1;
如下截图所示,你会发现这个查询SQL查不到任何记录。相信以前对数据类型datetimeoffset不太熟悉的人会对这个现象一脸懵逼......
那么我们通过下面例子来给你简单介绍一下,datetimeoffset通过不同方式转换为datetime有啥区别,具体脚本如下:
DECLARE @p1 DATETIMEOFFSET; DECLARE @p2 DATETIME; DECLARE @p3 DATETIME2; SET @p1='2020-10-03 11:10:36.9200000 +08:00' SET @p2=@p1; SET @p3=@p1; SELECT @p1 AS '@p1' ,@p2 AS '@p2' ,CAST(@p1 AS DATETIME) AS 'datetimeoffset_cast_datetime' ,CONVERT(DATETIME, @p1, 1) AS 'datetimeoffset_convert_datetime'
如下截图所示,通过CONVERT函数将datetiemoffset转换为datetime,你会发现上面这种方式丢失了时区信息,它将datetimeoffset转换为了UTC时间了。官方文档介绍:转换到datetime 时,会复制日期和时间值,时区被截断。
注意:datetiemoffset转换为datetime2也是同样的情况,这里不做赘述了。
所以,最开始,我们构造的案例中,出现那种现象是因为@p1和CREATE_TIME比较时,发生了隐式转换,datetiemoffset转换为datetime,而且转换过程中时区丢失了,此时的SQL实际等价于CREATE_TIME <='2020-10-03 03:10:36.920'了,那么怎么解决这个问题,如果在不改变数据类型的情况下,有什么解决方案解决这个问题呢?
DECLARE @p1 DATETIMEOFFSET; SET @p1='2020-10-03 11:12:36.9200000 +08:00' SELECT * FROM dbo.TEST WHERE CREATE_TIME <=CAST(@p1 AS DATETIME)
DECLARE @p1 DATETIMEOFFSET; SET @p1='2020-10-03 11:12:36.9200000 +08:00' SELECT * FROM dbo.TEST WHERE CREATE_TIME <=CONVERT(DATETIME, @p1, 0)
下面例子演示对比,有兴趣的话,自行执行SQL后对比观察
DECLARE @p1 DATETIMEOFFSET; DECLARE @p2 DATETIME; DECLARE @p3 DATETIME2; SET @p1='2020-10-03 11:10:36.9200000 +08:00' SET @p2=@p1; SET @p3=@p1; SELECT @p1 AS '@p1' ,@p2 AS '@p2' ,CAST(@p1 AS DATETIME) AS 'datetimeoffset_cast_datetime' ,CONVERT(DATETIME, @p1, 0) AS 'datetimeoffset_convert_datetime' ,CONVERT(DATETIME, @p1, 1) AS 'datetimeoffset_convert_datetime1'
注意之前的SQL Server版本不支持这种写法.
DECLARE @p1 DATETIMEOFFSET; SET @p1='2020-10-03 11:12:36.9200000 +08:00' SELECT * FROM dbo.TEST WHERE CREATE_TIME <= CONVERT(DATETIME, @p1 AT TIME ZONE 'UTC' AT TIME ZONE 'China Standard Time')
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了SQLServer主键和唯一约束的区别,需要的朋友可以参考下
这篇文章主要以实例讲解的方式为大家详细介绍了Spark SQL数据加载和保存的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章介绍了SQL Server中序列SEQUENCE的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本文详细讲解了SQL Server中JSON函数的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
sqlserver中行列互换怎么实现?有时候我们需要对数据的行列做互换,也就是将列的值作为列名称,那么具有要怎么操作呢?下面给大家分享使用 CASE END + 聚合函数来实现的思路以及方法,感兴趣的朋友可以参考。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008