[英]How to create a Date in SQL Server given the Day, Month and Year as Integers
例如,如果我有:
DECLARE @Day int = 25
DECLARE @Month int = 10
DECLARE @Year int = 2016
我想回來
2016-10-25
作為日期或日期時間
在 SQL Server 2012+ 中,您可以使用datefromparts()
:
select datefromparts(@year, @month, @day)
在早期版本中,您可以轉換字符串。 這是一種方法:
select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)
在 SQL Server 2012+ 中,可以使用DATEFROMPARTS
():
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
在早期版本中,一種方法是創建和轉換字符串。
無論日期、語言或國際化設置如何,SQL Server 都能可靠地解釋一些字符串日期格式。
六位或八位字符串始終被解釋為 ymd。 月和日必須始終為兩位數。
https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql
因此,格式為 'yyyymmdd' 的字符串將始終被正確解釋。
(ISO 8601-- YYYY-MM-DDThh:mm:ss
-- 也有效,但您必須指定時間,因此它比您需要的更復雜。)
雖然您可以簡單地將此字符串CAST
作為日期,但您必須使用CONVERT
來指定樣式,並且您 必須指定樣式才能確定性(如果這對您很重要)。
“yyyymmdd”格式為樣式 112,因此您的轉換如下所示:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
結果是:
2016-10-25
從技術上講,ISO/112/yyyymmdd 格式甚至適用於指定的其他樣式。 例如,使用樣式為 104(德語,dd.mm.yyyy)的文本格式:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),104);
也仍然導致:
2016-10-25
其他格式不那么健壯。 例如這個:
SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;
結果是:
0
作為旁注,使用此方法,請注意無意義的輸入可能會產生有效但不正確的日期:
DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
還產生:
2016-10-25
DATEFROMPARTS
保護您免受無效輸入的影響。 這個:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 32;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
產量:
消息 289,級別 16,狀態 1,第 2 行無法構造數據類型日期,某些參數的值無效。
另請注意,此方法不適用於 1000-01-01 之前的日期。 例如:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
產量:
消息 241,級別 16,狀態 1,第 2 行 從字符串轉換日期和/或時間時轉換失敗。
這是因為生成的字符串“9000101”不是“yyyymmdd”格式。 為了確保格式正確,您必須用前導零填充它,但會犧牲一些性能。 例如:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),8),112);
結果是:
0900-01-01
除了字符串轉換之外,還有其他方法。 “ 使用 T-SQL 創建日期”的答案中提供了幾個。 一個值得注意的示例涉及通過將年、月和日添加到“零日期”來創建日期。
(這個答案的靈感來自Gordon Linoff 的答案,我對其進行了擴展並提供了額外的文檔和注釋。)
以下代碼應該適用於我相信的所有版本的 sql server:
SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS DATE)
舊的 Microsoft Sql Sever (< 2012)
RETURN dateadd(month, 12 * @year + @month - 22801, @day - 1)
所以,你可以試試這個解決方案:
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
DECLARE @DATE AS DATETIME
SET @DATE = CAST(RTRIM(@YEAR * 10000 + @MONTH * 100 + @DAY) AS DATETIME)
SELECT REPLACE(CONVERT(VARCHAR(10), @DATE, 102), '.', '-') AS EXPECTDATE
或者你可以試試這幾行代碼:
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
SELECT CAST(RTRIM(@YEAR * 10000 +'-' + @MONTH * 100+ '-' + @DAY) AS DATE) AS EXPECTDATE
選擇轉換(varchar(11),transfer_date,106)
得到了我想要的日期格式為 2018 年 3 月 7 日的結果
我的“transfer_date”列是日期時間類型列,我在 azure 上使用 SQL Server 2017
在 SQL 中使用月年創建日期::
DECLARE @FromMonth int=NULL,
@ToMonth int=NULL,
@FromYear int=NULL,
@ToYear int=NULL
/**Region For Create Date**/
DECLARE @FromDate DATE=NULL
DECLARE @ToDate DATE=NULL
SET @FromDate=DateAdd(day,0, DateAdd(month, @FromMonth - 1,DateAdd(Year, @FromYear-1900, 0)))
SET @ToDate=DateAdd(day,-1, DateAdd(month, @ToMonth - 0,DateAdd(Year, @ToYear-1900, 0)))
/**Region For Create Date**/
對於 SQL Server 2008 用戶,我做了一個自定義函數:
CREATE FUNCTION sql2012_datefromparts
(
@Year int, @Month int, @Day int
)
RETURNS DATETIME
AS
BEGIN
RETURN convert(datetime,convert(varchar,@year)+right('0'+convert(varchar,@month),2)+right('0'+convert(varchar,@day),2))
END
GO
要使用它:
DECLARE @day int=29, @month int=10, @year int=1971
SELECT dbo.sql2012_datefromparts(@year,@month,@day)
使用FORMAT函數制作您喜歡的任何類型的格式。 這是復制粘貼工作示例:
DECLARE @year int = 2021, @month int = 12, @day int = 16
DECLARE @date varchar(20)
SET @date = cast((format(@year,'####') +'-'+format(@month,'##')+'-'+format(@day,'##')) as date)
SELECT @date
它還將顯示幾天和幾個月的前導零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.