本文主要介绍了在SQL Server中将日期时间集转换为日期时间类型的问题。这篇文章很详细,对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下
在SQL Server中,当数据类型datetimeoffset转换为datetime类型或datetime2类型时,应特别注意。如果不小心,可能会遇到以下情况。让我们构建一个简单的案例来模拟您可能遇到的情况。
创建表格测试
(
标识整数标识(1,1)
,创建时间日期时间
,约束主键_测试主键(标识)
);
去
插入测试(创建时间)
选择“2020-10-03 11:10:36”联合所有
选择“2020-10-03 11:11:36”联合所有
选择“2020-10-03 11:12:36”联合所有
SELECT ' 2020-10-03 11:1:36 ';
DECLARE @ p1 DATETIMEOFFSET
SET @ P1=' 2020-10-03 11:12:36.920000008:00 '
SELECT * FROM dbo。试验
其中CREATE _ TIME=@ p1
如下图所示,您会发现在这个查询SQL中找不到任何记录。我相信之前不熟悉datetimeoffset这种数据类型的人会面临这种现象.
然后我们通过下面的例子给大家简单介绍一下。用不同的方式把datetimeoffset转换成datetime有什么区别?具体脚本如下:
DECLARE @ p1 DATETIMEOFFSET
DECLARE @ p2 DATETIME
DECLARE @ p3 DATETIME2
SET @ P1=' 2020-10-03 11:10:36.920000008:00 '
SET @ p2=@ p1
SET @ p3=@ p1
选择@p1为' @p1 '
,@p2 AS '@p2 '
,CAST(@ P1 AS DATETIME)AS ' DATETIME offset _ CAST _ DATETIME '
,CONVERT(DATETIME,@p1,1)AS ' DATETIME offset _ CONVERT _ DATETIME '
如下图所示,通过使用convert函数将datetiemoffset转换为datetime,您会发现时区信息以上述方式丢失,它将datetimeoffset转换为UTC时间。官方文档介绍:转换为datetime时,会复制日期和时间值,时区会被截断。
注意:datetiemoffset转换为datetime2也是如此,这里就不赘述了。
因此,在开始时,在我们构建的案例中,出现这种现象是因为当@p1与CREATE_TIME比较时,发生了隐式转换,datetiemoffset转换为datetime,并且在转换过程中丢失了时区。这时的SQL其实相当于create _ time=' 2020-10-03 0:10336036.920 ',那又如何
场景1:使用CAST转换函数。
DECLARE @ p1 DATETIMEOFFSET
SET @ P1=' 2020-10-03 11:12:36.920000008:00 '
SELECT * FROM dbo。试验
其中CREATE_TIME=CAST(@p1为日期时间)
场景2:2:CONVERT函数中指定的date_style为0,可以保留时区信息。