搜尋本站文章

2013-01-24

SQL Server 2012:DATEFROMPARTS 從各自部分取得日期和時間值的函數


在先前 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/