在先前 SQL Server版本上,若要從各自部分取得的資料,轉型為日期和時間值,可以使用以下的方式:
EX1. CAST 或 CONVERT 轉換日期類型,SQL Server 2012 之前的作法
01_轉成為日期格式:2016-01-02
-- 01_轉成為日期格式:2016-01-02 -- 資料類型是 VARCHAR,可以轉型為:DATE 或 DATETIME。 DECLARE @Y VARCHAR(4) = '2016' DECLARE @M VARCHAR(2) = '01' DECLARE @D VARCHAR(2) = '02' SELECT CONVERT(DATE, @Y+@M+@D) AS N'DATE' SELECT CONVERT(DATETIME, @Y+@M+@D) AS N'DATETIME' GO
-- 01_資料類型是 VARCHAR,可以轉型為:DATE 或 DATETIME
02_假若資料類型是 INT,不允許從資料類型 int 明確轉換至 date
-- 02_假若資料類型是 INT,不允許從資料類型 int 明確轉換至 date DECLARE @Y INT = 2016 DECLARE @M INT = 01 DECLARE @D INT = 02 SELECT CONVERT(DATE, @Y+@M+@D) AS N'DATE' SELECT CONVERT(DATETIME, @Y+@M+@D) AS N'DATETIME' GO /* 訊息 529,層級 16,狀態 2,行 5 不允許從資料類型 int 明確轉換至 date。 */
-- 02_不允許從資料類型 int 明確轉換至 date
03_錯誤的日期資料:20130229,轉換失敗
-- 03_錯誤的日期資料:20130229,轉換失敗 DECLARE @Y VARCHAR(4) = '2013' DECLARE @M VARCHAR(2) = '02' DECLARE @D VARCHAR(2) = '29' SELECT CONVERT(DATE, @Y+@M+@D) AS N'DATE' SELECT CONVERT(DATETIME, @Y+@M+@D) AS N'DATETIME' GO /* 訊息 241,層級 16,狀態 1,行 7 從字元字串轉換成日期及/或時間時,轉換失敗。 */
-- 03_錯誤的日期資料,轉換失敗
DATEFROMPARTS日期函數
DATEFROMPARTS (Transact-SQL)
SQL Server 2012 版本新增加。
傳回指定之年、月、日的 date 值。
語法:
DATEFROMPARTS ( year, month, day )
引數:
(1) year:指定年份的整數運算式。
(2) month:指定月份的整數運算式,從 1 到 12。
(3) day:指定日期的整數運算式。
注意事項:
DATEFROMPARTS 傳回 date 值,其中日期部分會設為指定的年、月、日,而時間部分則會設為預設值。
如果引數無效,將會引發錯誤。
如果要求的引數為 null,即會傳回 null。
函數可以在 SQL Server 2012 伺服器和更新版伺服器上以遠端方式進行。
它在版本低於 SQL Server 2012 的伺服器上無法以遠端方式運作。
EX1. DATEFROMPARTS -- 有效的日期:2016-01-02
-- EX1. DATEFROMPARTS -- 有效的日期:2016-01-02 -- 輸入整數資料類型,回傳 DATE DECLARE @Y INT = 2016 DECLARE @M INT = 1 DECLARE @D INT = 2 SELECT DATEFROMPARTS(@Y, @M, @D) AS N'DATE' GO
-- 04_DATEFROMPARTS -- 有效的日期:2016-01-02
EX2. DATEFROMPARTS -- 無效的日期:錯誤 2013-02-29
-- EX2. DATEFROMPARTS -- 無效的日期:錯誤 2013-02-29 -- 輸入整數資料類型,回傳 DATE DECLARE @Y INT = 2013 DECLARE @M INT = 02 DECLARE @D INT = 29 SELECT DATEFROMPARTS(@Y, @M, @D) AS N'DATE' GO /* 訊息 289,層級 16,狀態 1,行 7 無法建構資料類型 date,部分引數擁有無效的值。 */
-- 05_DATEFROMPARTS -- 無效的日期:錯誤 2013-02-29
EX3. DATEFROMPARTS -- NULL 與日期
-- EX3. DATEFROMPARTS -- NULL 與日期 -- 輸入整數資料類型,回傳 DATE -- 回傳:NULL -- 若是使用 CAST、CONVERT 轉換函數,也是回傳:NULL DECLARE @Y INT = 2016 DECLARE @M INT = NULL DECLARE @D INT = 2 SELECT DATEFROMPARTS(@Y, @M, @D) AS N'DATE' GO
-- 06_DATEFROMPARTS -- NULL 與日期
EX4. DATEFROMPARTS:缺少參數,錯誤
-- EX4. DATEFROMPARTS:缺少參數,錯誤 -- 輸入整數資料類型,回傳 DATE DECLARE @Y INT = 2016 DECLARE @M INT = 1 DECLARE @D INT = 2 SELECT DATEFROMPARTS(@Y, @M) AS N'DATE' GO /* 訊息 174,層級 15,狀態 1,行 5 datefromparts 函數需要 3 個引數。 */
-- 07_DATEFROMPARTS:缺少參數,錯誤
參考資料
從各自部分取得日期和時間值的函數
http://technet.microsoft.com/zh-tw/library/ms186724.aspx
SQL SERVER 2012 -Date and Time Function – DATEFROMPARTS()
http://raresql.com/2012/08/31/sql-server-2012-date-and-time-function-datefromparts/
沒有留言:
張貼留言