programing

일, 월, 년을 정수로 지정한 SQL Server에서 날짜를 생성하는 방법

jooyons 2023. 5. 10. 20:52
반응형

일, 월, 년을 정수로 지정한 SQL Server에서 날짜를 생성하는 방법

예를 들어 다음과 같은 경우:

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+에서 ()를 사용할 수 있습니다.

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);

이전 버전에서는 문자열을 만들고 변환하는 방법이 있습니다.

날짜, 언어 또는 국제화 설정에 관계없이 SQL Server가 안정적으로 해석하는 몇 가지 문자열 날짜 형식이 있습니다.

6자리 또는 8자리 문자열은 항상 ymd로 해석됩니다.월과 일은 항상 두 자리여야 합니다.

https://learn.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);

산출물:

Msg 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);

산출물:

문자열에서 날짜 및/또는 시간을 변환할 때 Msg241, 레벨 16, 상태 1, 라인 2 변환에 실패했습니다.

이는 결과 문자열 '9000101'이 'yyyymmdd' 형식이 아니기 때문입니다.적절한 포맷을 보장하기 위해서는 적은 양의 성능을 희생하면서 선행 0으로 패딩해야 합니다.예:

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답변에서 영감을 얻었으며, 이 답변에 대해 자세히 설명하고 추가 문서와 참고 사항을 제공했습니다.)

이전 Microsoft SQL Server(< 2012)

RETURN dateadd(month, 12 * @year + @month - 22801, @day - 1)  

다음 코드는 제가 생각하는 모든 버전의 sql server에서 작동해야 합니다.

SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS 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

또한 며칠 및 몇 달 동안 선행 0을 표시합니다.

따라서 다음 솔루션을 사용해 볼 수 있습니다.

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' 열은 datetime 유형 열이며 zure에서 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**/

언급URL : https://stackoverflow.com/questions/35576983/how-to-create-a-date-in-sql-server-given-the-day-month-and-year-as-integers

반응형