华为鸿蒙 另类堆栈 JS haskell memory Amaze UI 微信小游戏开发视频 springboot单点登录 mysql操作日志 js对象添加元素 matlab插值函数 python关键字 python开发工具 javaindexof java开发 javaforeach java基础学习 java获取当前月 java重载和重写的区别 java匿名对象 java自定义异常 java框架学习 java对象序列化 java删除数组中的某个元素 java文件输入输出 sql实例 图吧导航怎么样 tar文件怎么打开 unix操作系统下载 微信超级好友 网络是怎样连接的 html特殊字符 kms神龙 php取整函数 源计划艾克 朋友圈访客记录教程 苹果双微信 视频加文字用什么软件 国都证券官网下载 威纶通触摸屏编程软件
当前位置: 首页 > 学习教程  > 编程语言

WhatsApp群发助手源码分享

2020/12/28 19:24:34 文章标签:

在SQL Server中,数据类型datetimeoffset转换为datetime类型或datetime2类型时需要特别注意,有可能一不小心你可能会碰到下面这种情况。下面我们构造一个简单案例,模拟一下你们可能遇到的情况。 CREATE TABLE TEST ( ID INT IDENTITY(1,1) ,C…

在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不太熟悉的人会对这个现象一脸懵逼…

clip_image001

那么我们通过下面例子来给你简单介绍一下,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也是同样的情况,这里不做赘述了。

clip_image002

所以,最开始,我们构造的案例中,出现那种现象是因为@p1和CREATE_TIME比较时,发生了隐式转换,datetiemoffset转换为datetime,而且转换过程中时区丢失了,此时的SQL实际等价于CREATE_TIME <='2020-10-03 03:10:36.920’了,那么怎么解决这个问题,如果在不改变数据类型的情况下,有什么解决方案解决这个问题呢?

方案1:使用CAST转换函数。

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)

方案2:CONVERT函数中指定date_style为0 ,可以保留时区信息。

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’

clip_image003

方案3:SQL Server 2016(13.x)或以后的版本可以使用下面方案。注意之前的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’)
作者:潇湘隐者
出处:http://www.cnblogs.com/kerrycode/

如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.


本文链接: http://www.dtmao.cc/news_show_550244.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?