SQL Server Cast、Convert數據類型轉換

来源:https://www.cnblogs.com/chenmh/archive/2018/03/16/8582104.html
-Advertisement-
Play Games

一、概述 本篇文章轉載來著官網線上文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。 語法 Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] ) Syntax for CONVERT: C ...


一、概述

本篇文章轉載來著官網線上文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。

 

語法

Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )

Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
參數

expression:任何有效的表達式。

data_type:目標數據類型。這包括 xmlbigintsql_variant。不能使用別名數據類型。有關可用數據類型的詳細信息,請參閱數據類型 (Transact-SQL)。
length:指定目標數據類型長度的可選整數。預設值為 30。
style:指定 CONVERT 函數如何轉換 expression 的整數表達式。如果樣式為 NULL,則返回 NULL。該範圍是由 data_type 確定的。有關詳細信息,請參閱“備註”部分。

Date 和 Time 樣式

如果 expression 為 date 或 time 數據類型,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。SQL Server 使用科威特演算法來支持阿拉伯樣式的日期格式。
不帶世紀數位 (yy) (1)帶世紀數位 (yyyy)標準輸入/輸出 (3)

-

0100 (1, 2)

預設

mon dd yyyy hh:miAM(或 PM)

1

101

美國

mm/dd/yyyy

2

102

ANSI

yy.mm.dd

3

103

英國/法國

dd/mm/yyyy

4

104

德國

dd.mm.yy

5

105

義大利

dd-mm-yy

6

106 (1)

-

dd mon yy

7

107 (1)

-

mon dd, yy

8

108

-

hh:mi:ss

-

9109 (1, 2)

預設設置 + 毫秒

mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10

110

美國

mm-dd-yy

11

111

日本

yy/mm/dd

12

112

ISO

yymmdd

yyyymmdd

-

13113 (1, 2)

歐洲預設設置 + 毫秒

dd mon yyyy hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20120 (2)

ODBC 規範

yyyy-mm-dd hh:mi:ss(24h)

-

21121 (2)

ODBC 規範(帶毫秒)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(無空格)

-

127(6, 7)

帶時區 Z 的 ISO8601。

yyyy-mm-ddThh:mi:ss.mmmZ

(無空格)

-

130 (1, 2)

回歷 (5)

dd mon yyyy hh:mi:ss:mmmAM

-

131 (2)

回歷 (5)

dd/mm/yy hh:mi:ss:mmmAM

1 這些樣式值將返回不確定的結果。包括所有 (yy)(不帶世紀數位)樣式和一部分 (yyyy)(帶世紀數位)樣式。

2 預設值(style 010091091311320120 以及 21121)始終返回世紀數位 (yyyy)。

3 轉換為 datetime 時輸入;轉換為字元數據時輸出。

4 為用於 XML 而設計。對於從 datetimesmalldatetime 到字元數據的轉換,其輸出格式如上一個表所述。

5 回歷是有多種變體的日曆系統。SQL Server 使用科威特演算法。

註意:預設情況下,SQL Server 基於截止年份 2049 年來解釋兩位數的年份。換言之,就是將兩位數的年份 49 解釋為 2049,將兩位數的年份 50 解釋為 1950。許多客戶端應用程式(如基於自動化對象的應用程式)都使用截止年份 2030 年。SQL Server 提供了 two digit year cutoff 配置選項,可通過此選項更改 SQL Server 使用的截止年份,從而對日期進行一致處理。建議您指定四位數年份。

6 僅支持從字元數據轉換為 datetimesmalldatetime。僅表示日期或時間成分的字元數據轉換為 datetimesmalldatetime 數據類型時,未指定的時間成分設置為 00:00:00.000,未指定的日期成分設置為 1900-01-01。

7使用可選的時間區域指示符 (Z) 更便於將具有時區信息的 XML datetime 值映射到沒有時區的 SQL Server datetime 值。Z 是時區 UTC-0 的指示符。其他時區則以 + 或 - 方向的 HH:MM 偏移量來指示。例如:2006-12-12T23:45:12-08:00

smalldatetime 轉換為字元數據時,包含秒或毫秒的樣式將在這些位置上顯示零。使用相應的 charvarchar 數據類型長度從 datetimesmalldatetime 值轉換時,可截斷不需要的日期部分。

從樣式包含時間的字元數據轉換為 datetimeoffset 時,將在結果末尾追加時區偏移量。

float 和 real 樣式

如果 expression 為 floatreal,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(預設值)

最多包含 6 位。根據需要使用科學記數法。

1

始終為 8 位值。始終使用科學記數法。

2

始終為 16 位值。始終使用科學記數法。

126, 128, 129

為了保持向後相容而包括在內,在以後的版本中可能不推薦使用。

money 和 smallmoney 樣式

如果 expression 為 moneysmallmoney,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(預設值)

小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。

1

小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。

2

小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。

126

轉換為 char(n) 或 varchar(n) 時,等同於樣式 2

xml 樣式

如果 data_type 為 xml,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(預設值)

使用預設的分析行為,即放棄無用的空格,且不允許使用內部 DTD 子集。

註意:

轉換為 xml 數據類型時,SQL Server 的無用空格處理方式不同於 XML 1.0。有關詳細信息,請參閱生成 XML 實例。

1

保留無用空格。此樣式設置將預設的 xml:space 處理方式設置為與指定了 xml:space="preserve" 的行為相同。

2

啟用有限的內部 DTD 子集處理。

如果啟用,則伺服器可使用內部 DTD 子集提供的以下信息來執行非驗證分析操作。

應用屬性的預設值。

解析並擴展內部實體引用。

檢查 DTD 內容模型以實現語法的正確性。

分析器將忽略外部 DTD 子集。此外,不評估 XML 聲明來查看 standalone 屬性是設置為 yes 還是 no,而是將 XML 實例當成一個獨立文檔進行分析。

3

保留無用空格,並啟用有限的內部 DTD 子集處理。

二進位樣式

如果 expression 為 binary(n)varbinary(n)char(n)varchar(n),則 style 可以為下表中顯示的值之一。表中沒有列出的樣式值將返回錯誤。

輸出

0(預設值)

將 ASCII 字元轉換為二進位位元組,或者將二進位位元組轉換為 ASCII 字元。每個字元或位元組按照 1:1 進行轉換。

如果 data_type 為二進位類型,則會在結果左側添加字元 0x。

1, 2

如果 data_type 為二進位類型,則表達式必須為字元表達式。expression 必須由數量為偶數的十六進位數字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)組成。如果將 style 設置為 1,字元 0x 必須為表達式中的前兩個字元。如果表達式中包含的字元數為奇數或者包含任何無效的字元,則會引發錯誤。

如果轉換後的表達式長度大於 data_type 長度,則會在右側截斷結果。

如果固定長度 data_types 大於轉換後的結果,則會在結果右側添加零。

如果 data_type 為字元類型,則表達式必須為二進位表達式。每個二進位字元均轉換為兩個十六進位字元。如果轉換後的表達式長度大於 data_type 長度,則會在右側截斷結果。

如果 data_type 為固定大小的字元類型,並且轉換後的結果長度小於其 data_type 長度,則會在轉換後的表達式右側添加空格,以使十六進位數字的個數保持為偶數。

對於 style 1,將在轉換後的結果左側添加字元 0x。

隱式轉換

隱式轉換指那些沒有指定 CAST 或 CONVERT 函數的轉換。顯式轉換指那些需要指定 CAST 或 CONVERT 函數的轉換。以下圖例顯示了可對 SQL Server 系統提供的數據類型執行的所有顯式和隱式數據類型轉換。其中包括 xmlbigintsql_variant。不存在對 sql_variant 數據類型的賦值進行的隱式轉換,但是存在轉換為 sql_variant 的隱式轉換。

datetimeoffset 與字元類型 charvarcharncharnvarchar 之間轉換時,轉換後的時區偏移量部分的 HH 和 MM 都應始終為兩個數字,例如 -08:00。

註意:因為 Unicode 數據始終使用偶數個位元組,所以在 binaryvarbinary 與支持 Unicode 的數據類型之間進行轉換時會使用警告。例如,以下轉換不返回十六進位值 41;而是返回 4100:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

大值數據類型

大值數據類型表現出與小值數據類型相同的隱式和顯式轉換行為,特別是 varcharnvarcharvarbinary 數據類型。但是,應該考慮以下原則:

  • imagevarbinary(max) 的轉換與反向轉換是隱式轉換,textvarchar(max)ntextnvarchar(max) 之間的轉換也是隱式轉換。

  • 從大值數據類型(如 varchar(max))到小值數據類型(如 varchar)的轉換是隱式轉換,但如果大值相對於指定長度的小值數據類型顯得太大,則產生截斷。

  • varcharnvarcharvarbinary 到其相應的大值數據類型的轉換都是隱式執行的。

  • sql_variant 數據類型到大值數據類型的轉換是顯式轉換。

  • 大值數據類型不能轉換為 sql_variant 數據類型。

有關如何轉換 Microsoft .NET Framework 公共語言運行時 (CLR) 用戶定義類型的信息,請參閱對用戶定義類型執行操作。有關如何從 xml 數據類型進行轉換的詳細信息。

xml 數據類型

當您將 xml 數據類型顯式或隱式轉換為字元串或二進位數據類型時,xml 數據類型的內容將根據一組規則進行序列化。有關這些規則的信息,請參閱 XML 數據的序列化。有關如何從 XML 轉換為 CLR 用戶定義類型的信息,請參閱對用戶定義類型執行操作。有關如何從其他數據類型轉換到 xml 數據類型的信息。

文本和圖像數據類型

不支持對 textimage 數據類型進行自動數據類型轉換。可將 text 數據顯式轉換為字元數據,將 image 數據轉換為 binaryvarbinary,但最大長度是 8000 位元組。如果試圖進行不正確的轉換,如將包含字母的字元表達式轉換為 int,則 SQL Server 將返回錯誤消息。

輸出排序規則

如果 CAST 或 CONVERT 的輸出是字元串,並且輸入也是字元串,則輸出將與輸入具有相同的排序規則和排序規則標簽。如果輸入不是字元串,則輸出採用資料庫的預設排序規則以及強制預設的排序規則標簽。

若要為輸出分配不同的排序規則,請將 COLLATE 子句應用於 CAST 或 CONVERT 函數的結果表達式。例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

截斷結果和舍入結果

將字元或二進位表達式(charncharnvarcharvarcharbinaryvarbinary)轉換為其他數據類型的表達式時,可截斷數據,僅顯示部分數據,或返回錯誤(因為結果太短而無法顯示)。除了下表顯示的轉換,其他到 charvarcharncharnvarcharbinaryvarbinary 的轉換都將被截斷。

 

被轉換的數據類型轉換為的數據類型結果

intsmallinttinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

moneysmallmoneynumericdecimalfloatreal

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = 結果長度太短而無法顯示。E = 因為結果長度太短無法顯示而返回錯誤。

SQL Server 僅保證往返轉換(即從原始數據類型進行轉換後又返回原始數據類型的轉換)在各版本間產生相同值。以下示例顯示的即是這樣的往返轉換:

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))
 

註意:不要嘗試構造 binary 值然後將其轉換為數值數據類型類別的一種數據類型。SQL Server 不能保證 decimalnumeric 數據類型到 binary 的轉換結果在 SQL Server 的各個版本中都相同。

轉換小數位數不同的數據類型時,結果值有時被截斷,有時被舍入。下表顯示了此行為。

被轉換的數據類型轉換到的數據類型行為

numeric

numeric

舍入

numeric

int

截斷

numeric

money

舍入

money

int

舍入

money

numeric

舍入

float

int

截斷

float

numeric

舍入

float

datetime

舍入

datetime

int

舍入

例如,以下轉換的結果為 10

SELECT CAST(10.6496 AS int)

在進行數據類型轉換時,若目標數據類型的小數位數小於源數據類型的小數位數,則該值將被截斷。例如,以下轉換的結果為 $10.3497

SELECT CAST(10.3496847 AS money)

當非數字型 charncharvarcharnvarchar 數據轉換為 intfloatnumericdecimal 時,SQL Server 將返回錯誤消息。當空字元串 (" ") 轉換為 numericdecimal 時,SQL Server 也返回錯誤。

 

 

備註:文章轉載來自官方線上文檔。

 

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、課程介紹 我們都知道在軟體架構方式分為:C/S和B/S兩類。這裡阿笨不談論兩種軟體架構的優劣之分,因為它們各有千秋,用於不同場合。一位偉大的講師曾經說過一句話:事物存在即合理!錄製這堂課程的目的就是專門給想學習和瞭解WinForm應用程式的童鞋們。雖然當前主流的架構開發的確大多是WEB端和App ...
  • 第一列:有11位 1)第一位表示文件類型 1)l表示鏈接文件 2)d表示目錄 3)-普通文件 4)b塊設備 磁碟分區就是這種類型 5)c 串列埠設備文件(字元設備文件),比如鍵盤,滑鼠,印表機,tty終端等 6)s套接字文件,用於進程間的通信。 2)類型後面的9位,每三位為一組。r可讀,w可寫,x ...
  • 情況:本地的虛擬機 被 Shell攻擊連接時 連接時間過長 解決方法: 1> 查看ssh服務(Linux 遠程登錄服務) 是否正常運行 2>查看ssh配置文件 /etc/ssh/sshd_conig (看紅色部分是否為yes 或者是否打開 然後改成 no) 3>重啟sshd服務。 ...
  • 埠概述 在STM32中,每個I/O埠可以由軟體配置成為輸入/輸出模式。複位期間或剛複位後,I/O埠被配置成浮空輸入模式。所有的GPIO引腳有一個內部弱上拉和弱下拉,當配置為輸入時, 它們可以被激活或者是斷開。 所有的埠都有外部中斷的能力。 AF功能:對於復用功能,埠必須配置成復用功能輸出模 ...
  • 此方法不需要修改Tomcat配置 親測,可用 1.在tomcat bin目錄下添加文件clear_log.sh 內容如下: #!/bin/shd=`date +%Y-%m-%d`d7=`date -d'7 day ago' +%Y-%m-%d`cp /opt/apache-tomcat-8.5.9/ ...
  • 1、列出當前系統上所有已經登錄的用戶的用戶名,註意:同一個用戶登錄多次,則只顯示一次即可。 2、取出最後登錄到當前系統的用戶的相關信息。 3、取出當前系統上被用戶當作其預設shell的最多的那個shell。 4、將/etc/passwd中的第三個欄位數值最大的後10個用戶的信息全部改為大寫後保存至/ ...
  • 1.虛擬機把磁碟大小進行改動 2.sudo apt-get install gparted 3.打開安裝好的應用 4.進行分區改動 5.理論刪除sda2和sda5重整後邊即可,但此時sda2和sda5可能會處在啟用交互的狀態: 6.右鍵禁止後依次刪除sda5和sda2,重新分配sda1後,把預留的位 ...
  • 一、高通sensor架構: linux驅動由淺入深系列:高通sensor架構實例分析之一(整體概覽+AP側代碼分析) linux驅動由淺入深系列:高通sensor架構實例分析之二(adsp驅動代碼結構) Linux驅動由淺入深系列:高通sensor架構實例分析之三(adsp上報數據詳解、校準流程詳解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...