복붙노트

[SQL] 정수와 일, 월 및 연도 주어진 SQL Server에서 날짜를 만드는 방법

SQL

정수와 일, 월 및 연도 주어진 SQL Server에서 날짜를 만드는 방법

예를 들어 내가있는 경우 :

DECLARE @Day int = 25
DECLARE @Month int  = 10 
DECLARE @Year int = 2016

나는 돌아가려면

2016-10-25

날짜 또는 날짜로

해결법

  1. ==============================

    1.SQL 서버 2012+, 당신은) (datefromparts을 사용할 수 있습니다 :

    SQL 서버 2012+, 당신은) (datefromparts을 사용할 수 있습니다 :

    select datefromparts(@year, @month, @day)
    

    이전 버전에서는 문자열을 캐스팅 할 수 있습니다. 여기에 한 가지 방법은 다음과 같습니다

    select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)
    
  2. ==============================

    2.SQL 서버 2012+, 당신은) (DATEFROMPARTS을 사용할 수 있습니다 :

    SQL 서버 2012+, 당신은) (DATEFROMPARTS을 사용할 수 있습니다 :

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

    이전 버전에서는 하나의 방법은 문자열을 생성하고 변환하는 것입니다.

    SQL 서버는 신뢰성에 관계없이 날짜, 언어 또는 국제화 설정의 해석 몇 가지 문자열 날짜 형식이 있습니다.

    https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql

    형식은 'YYYYMMDD'의 문자열 그래서 항상 제대로 해석됩니다.

    (ISO 8601-- YYYY-MM ISO 형식은 : 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);
    

    그리고 그것은 결과 :

    기술적으로, 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);
    

    또한 아직 결과 :

    다른 형식은 강력한으로하지 않습니다. 예를 들어,이 :

    SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;
    

    결과 :

    사이드 참고로,이 방법으로 유효하지만 잘못된 날짜를 얻을 수 넌센스 입력을 조심 :

    DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
    SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
    

    또한 산출한다 :

    DATEFROMPARTS가 잘못 입력으로부터 사용자를 보호합니다. 이:

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

    수익률 :

    또한이 방법은 1000년 1월 1일 이전 날짜에 대해 작동하지 않습니다 조심. 예를 들면 :

    DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
    SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
    

    수익률 :

    그의는 결과 문자열 때문에, '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);
    

    결과 :

    문자열 변환을 제외하고 다른 방법이 있습니다. 몇몇은 "T-SQL과 날짜를 만들기"에 대한 답변에서 제공됩니다. 주목할만한 예는 "제로 날짜"를 년, 월, 일을 추가하여 날짜를 만드는 작업이 포함됩니다.

    (이 답변은 내가에 확장 및 추가 문서 및 메모를 제공 고든 리노 프의 대답에 의해 영감을했다.)

  3. ==============================

    3.다음 코드는 내가 믿는 SQL 서버의 모든 버전에서 작동합니다 :

    다음 코드는 내가 믿는 SQL 서버의 모든 버전에서 작동합니다 :

    SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS DATE)
    
  4. ==============================

    4.올드 마이크로 소프트 SQL 서버 (<2012)

    올드 마이크로 소프트 SQL 서버 (<2012)

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

    5.그래서, 당신은이 솔루션을 시도 할 수 있습니다 :

    그래서, 당신은이 솔루션을 시도 할 수 있습니다 :

    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
    
  6. ==============================

    6.선택 변환 (VARCHAR (11), transfer_date, 106)

    선택 변환 (VARCHAR (11), transfer_date, 106)

    나에게 2018 3월 7일로 포맷 된 날짜의 내 원하는 결과를 얻었다

    내 열 'transfer_date'는 날짜 형식 열 내가 푸른에 SQL 서버 2017을 사용하고 있습니다

  7. ==============================

    7.MONTH 해 SQL을 사용하여 생성 날짜 :

    MONTH 해 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**/
    
  8. from https://stackoverflow.com/questions/35576983/how-to-create-a-date-in-sql-server-given-the-day-month-and-year-as-integers by cc-by-sa and MIT license