簡體   English   中英

如何在 SQL 服務器中創建日期,將日、月和年作為整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM