溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在SQL Server數據庫中將datetimeset轉換為datetime類型

發布時間:2020-12-29 09:09:51 來源:億速云 閱讀:289 作者:Leah 欄目:開發技術

怎么在SQL Server數據庫中將datetimeset轉換為datetime類型?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

在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不太熟悉的人會對這個現象一臉懵逼......

怎么在SQL Server數據庫中將datetimeset轉換為datetime類型

那么我們通過下面例子來給你簡單介紹一下,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也是同樣的情況,這里不做贅述了。

怎么在SQL Server數據庫中將datetimeset轉換為datetime類型

所以,最開始,我們構造的案例中,出現那種現象是因為@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'

怎么在SQL Server數據庫中將datetimeset轉換為datetime類型

方案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')

看完上述內容,你們掌握怎么在SQL Server數據庫中將datetimeset轉換為datetime類型的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女