복붙노트

[SQL] T-SQL과 함께 일 월 및 연도에서 날짜를 만들기

SQL

T-SQL과 함께 일 월 및 연도에서 날짜를 만들기

나는 다음을 시도 2005 SQL Server에서 날짜에 같은 12, 1, 2007 등의 개별 부품으로 날짜를 변환하는 것을 시도하고있다 :

CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)

그러나 잘못된 일이 발생합니다. 어떤 것은 적절한 날짜 형식으로 세 개의 날짜 값을 설정하는 올바른 방법입니다.

해결법

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

    1.가정하고, Y, M, D는 모두 INT 방법이다 :

    가정하고, Y, M, D는 모두 INT 방법이다 :

    CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)
    

    위의 SQL 서버 2012에 대한 내 다른 대답을 참조하십시오

  2. ==============================

    2.이 시도:

    이 시도:

    Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
    Declare @Month TinyInt Set @Month = 6
    Declare @Year Integer Set @Year = 2006
    -- ------------------------------------
    Select DateAdd(day, @DayOfMonth - 1, 
              DateAdd(month, @Month - 1, 
                  DateAdd(Year, @Year-1900, 0)))
    

    물론, 모든 문자열 변환을 수행하지의 혜택을 추가했다대로 (매우 빠르게) 순수한 연산 처리, 그래서 그것은 작동하고 그것은 어떤 날짜 형식에 따라 아니다 날짜 및 smalldatetime으로 값 SQL 서버의 내부 표현 1 일월 1900 년 이후의 일 수를 나타내는 정수이고, 상기 제 일부가 두 부분의 값이고, 두번째 부분은 소수 부분을 나타내는 소수 부분이라는 사실이는 대문자 (시간에) 1 일 --- 정수 값 0 (영) 항상 1900년 1월 1일의 자정 아침에 직접 변환 그래서 ...

    또는, @brinary에서 제안 덕분에,

    Select DateAdd(yy, @Year-1900,  
           DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 
    

    @cade 루, SQL 2012 년까지 언급 한 바와 같이 편집 2014 년 10 월 지금있는 내장 기능 : DATEFROMPARTS (년, 월, 일) 그 같은 일을한다.

    편집 2016년 10월 3일 (이 알았어,하고 고정 @brinary에 대한 @bambams 덕분에), @brinary에 의해 제안 된 마지막 솔루션. 년 또한이 먼저 수행하지 않는 윤년 작업에 표시되지 않습니다

    select dateadd(month, @Month - 1, 
         dateadd(year, @Year-1900, @DayOfMonth - 1)); 
    
  3. ==============================

    3.SQL 서버 2012 (날짜가 유효하지 않은 경우 오류가 발생합니다 - 내 주요 이의를이 문제에 대한 DATEADD 기반 솔루션에) 멋진과 대망의 새 DATEFROMPARTS 기능이 있습니다 :

    SQL 서버 2012 (날짜가 유효하지 않은 경우 오류가 발생합니다 - 내 주요 이의를이 문제에 대한 DATEADD 기반 솔루션에) 멋진과 대망의 새 DATEFROMPARTS 기능이 있습니다 :

    http://msdn.microsoft.com/en-us/library/hh213228.aspx

    DATEFROMPARTS(ycolumn, mcolumn, dcolumn)
    

    또는

    DATEFROMPARTS(@y, @m, @d)
    
  4. ==============================

    4.또는 단지 하나의 DATEADD 함수를 사용하여 :

    또는 단지 하나의 DATEADD 함수를 사용하여 :

    DECLARE @day int, @month int, @year int
    SELECT @day = 4, @month = 3, @year = 2011
    
    SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)
    
  5. ==============================

    5.SQL 서버 2012 부품 (DATEFROMPARTS)를 기반으로 날짜를 생성하는 기능을 가지고 있습니다. 우리의 나머지를 위해, 여기에 내가 부품 (감사 @Charles)에서 날짜를 결정하는 것을 만든 DB 기능입니다 ...

    SQL 서버 2012 부품 (DATEFROMPARTS)를 기반으로 날짜를 생성하는 기능을 가지고 있습니다. 우리의 나머지를 위해, 여기에 내가 부품 (감사 @Charles)에서 날짜를 결정하는 것을 만든 DB 기능입니다 ...

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[func_DateFromParts]'))
        DROP FUNCTION [dbo].[func_DateFromParts]
    GO
    
    CREATE FUNCTION [dbo].[func_DateFromParts]
    (
        @Year INT,
        @Month INT,
        @DayOfMonth INT,
        @Hour INT = 0,  -- based on 24 hour clock (add 12 for PM :)
        @Min INT = 0,
        @Sec INT = 0
    )
    RETURNS DATETIME
    AS
    BEGIN
    
        RETURN DATEADD(second, @Sec, 
                DATEADD(minute, @Min, 
                DATEADD(hour, @Hour,
                DATEADD(day, @DayOfMonth - 1, 
                DATEADD(month, @Month - 1, 
                DATEADD(Year, @Year-1900, 0))))))
    
    END
    
    GO
    

    이처럼 호출 할 수 있습니다 ...

    SELECT dbo.func_DateFromParts(2013, 10, 4, 15, 50, DEFAULT)
    

    보고...

    2013-10-04 15:50:00.000
    
  6. ==============================

    6.대신 CAST의 CONVERT를 사용해보십시오.

    대신 CAST의 CONVERT를 사용해보십시오.

    CONVERT는 날짜 형식을 나타내는 세 번째 매개 변수를 할 수 있습니다.

    형식 목록은 여기에 있습니다 : http://msdn.microsoft.com/en-us/library/ms187928.aspx

    다른 답변 후 업데이트는 "올바른"답으로 선택되었습니다

    답변이 제한을 표시하지 않고, 분명 당신의 서버에있는 NLS 설정에 따라 달라 선택 이유를 정말 이해가 안 돼요.

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

    7.당신은 또한 사용할 수 있습니다

    당신은 또한 사용할 수 있습니다

    select DATEFROMPARTS(year, month, day) as ColDate, Col2, Col3 
    From MyTable Where DATEFROMPARTS(year, month, day) Between @DateIni and @DateEnd
    

    ver.2012과 푸른 SQL 이후 SQL의 작품

  8. ==============================

    8.명시 적 시작점 '19000101'을 사용하는 것이 안전하고 깔끔

    명시 적 시작점 '19000101'을 사용하는 것이 안전하고 깔끔

    create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int)
    returns datetime2
    as
    begin
        -- Note! SQL Server 2012 includes datetime2fromparts() function
        declare @output datetime2 = '19000101'
        set @output = dateadd(year      , @Year - 1900  , @output)
        set @output = dateadd(month     , @Month - 1    , @output)
        set @output = dateadd(day       , @Day - 1      , @output)
        set @output = dateadd(hour      , @Hour         , @output)
        set @output = dateadd(minute    , @Minute       , @output)
        set @output = dateadd(second    , @Second       , @output)
        set @output = dateadd(ns        , @Nanosecond   , @output)
        return @output
    end
    
  9. ==============================

    9.당신은뿐만 아니라, 그것의이 작품을 문자열을 유지 (함수에 넣어)하지 않으려면 :

    당신은뿐만 아니라, 그것의이 작품을 문자열을 유지 (함수에 넣어)하지 않으려면 :

    DECLARE @Day int, @Month int, @Year int
    SELECT @Day = 1, @Month = 2, @Year = 2008
    
    SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))
    
  10. ==============================

    10.당신이 두 날짜와 시간 부분에서 날짜 시간을 필요로하는 경우 I는 한 줄 솔루션을 추가 :

    당신이 두 날짜와 시간 부분에서 날짜 시간을 필요로하는 경우 I는 한 줄 솔루션을 추가 :

    select dateadd(month, (@Year -1900)*12 + @Month -1, @DayOfMonth -1) + dateadd(ss, @Hour*3600 + @Minute*60 + @Second, 0) + dateadd(ms, @Millisecond, 0)
    
  11. ==============================

    11.시험

    시험

    CAST(STR(DATEPART(year, DATE))+'-'+ STR(DATEPART(month, DATE)) +'-'+ STR(DATEPART(day, DATE)) AS DATETIME)
    
  12. ==============================

    12.12 아래의 SQL 서버 버전의 난 SET의 DATEFORMAT와 함께 CAST의 사용을 추천 할 수 있습니다

    12 아래의 SQL 서버 버전의 난 SET의 DATEFORMAT와 함께 CAST의 사용을 추천 할 수 있습니다

    -- 26 February 2015
    SET DATEFORMAT dmy
    SELECT CAST('26-2-2015' AS DATE)
    
    SET DATEFORMAT ymd
    SELECT CAST('2015-2-26' AS DATE)
    

    당신은 당신에게 달려 그 문자열을 만드는 방법

  13. ==============================

    13.이 쿼리 검색 :

    이 쿼리 검색 :

        SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS
        YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS
    MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1
    

    결과:

    2014    Ja    1
    2015    Ja    1
    2014    Ja    1
    2015    Ja    1
    2012    Ja    1
    2010    Ja    1
    2015    Ja    1
    
  14. ==============================

    14.나는 영업 이익은 SQL 2005 대답을 요구하고 있지만 문제는 다음을 사용할 수 있습니다 SQL 2012 또는 이상을 실행하는 경우 꽤 오래된 그렇게 알고 :

    나는 영업 이익은 SQL 2005 대답을 요구하고 있지만 문제는 다음을 사용할 수 있습니다 SQL 2012 또는 이상을 실행하는 경우 꽤 오래된 그렇게 알고 :

    SELECT DATEADD(DAY, 1, EOMONTH(@somedate, -1))
    

    참고: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions

  15. ==============================

    15.이 클렌징 옵션과 필요에 따라 문자열을 분할하는 기능을 제공합니다 나는 개인적으로 문자열을 선호합니다. 가정은 데이터가 포맷 'DD YYYY 년 MM'라는 것이다.

    이 클렌징 옵션과 필요에 따라 문자열을 분할하는 기능을 제공합니다 나는 개인적으로 문자열을 선호합니다. 가정은 데이터가 포맷 'DD YYYY 년 MM'라는 것이다.

    --2012 and above
    SELECT CONCAT (
            RIGHT(REPLACE(@date, ' ', ''), 4)
            ,'-'
            ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5)),2)
            ,'-'
            ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1)),2)
            )
    
    --2008 and below
    SELECT   RIGHT(REPLACE(@date, ' ', ''), 4)
            +'-'
            +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5),2)
            +'-'
            +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1),2)
    

    여기에 데이터가 컬럼에 저장되어있는 경우가 소송을 제기 할 수있는 방법의 데모입니다. 도없이 이상적인 컬럼에 적용하기 전에 결과 집합을 확인 말할

    DECLARE @Table TABLE (ID INT IDENTITY(1000,1), DateString VARCHAR(50), DateColumn DATE)
    
    INSERT INTO @Table
    SELECT'12, 1, 2007',NULL
    UNION
    SELECT'15,3, 2007',NULL
    UNION
    SELECT'18, 11 , 2007',NULL
    UNION
    SELECT'22 , 11, 2007',NULL
    UNION
    SELECT'30, 12, 2007  ',NULL
    
    UPDATE @Table
    SET DateColumn = CONCAT (
            RIGHT(REPLACE(DateString, ' ', ''), 4)
            ,'-'
            ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), CHARINDEX(',', REPLACE(DateString, ' ', '')) + 1, LEN(REPLACE(DateString, ' ', '')) - CHARINDEX(',', REPLACE(DateString, ' ', '')) - 5)),2)
            ,'-'
            ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), 1, CHARINDEX(',', REPLACE(DateString, ' ', '')) - 1)),2)
            ) 
    
    SELECT ID,DateString,DateColumn
    FROM @Table
    
  16. from https://stackoverflow.com/questions/266924/create-a-date-from-day-month-and-year-with-t-sql by cc-by-sa and MIT license