programing

T-SQL을 사용하여 월/년 날짜 생성

starjava 2023. 4. 7. 20:49
반응형

T-SQL을 사용하여 월/년 날짜 생성

SQL Server 2005에서 12, 1, 2007과 같은 개별 부분이 있는 날짜를 날짜/시간으로 변환하려고 합니다.다음을 시도했습니다.

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

이렇게 되면 날짜가 틀려요.3개의 날짜 값을 적절한 날짜/시간 형식으로 변환하는 올바른 방법은 무엇입니까?

이것을 시험해 보세요.

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

또, 스트링 변환을 실시하지 않는 메리트가 추가되어 있습니다.따라서 완전한 산술 처리(매우 빠름)이며 날짜 형식에 의존하지 않습니다.이것은 SQL Server의 datetime 값과 smaldatetime 값의 내부 표현이 1900년 1월 1일 이후의 일수를 나타내는 정수인 2부분 값이라는 사실을 이용합니다.그리고 두 번째 부분은 1일(시간)의 소수 부분을 나타내는 십진수입니다.따라서 정수값 0은 항상 1900년 1월1일의 Midnight Morning으로 직접 변환됩니다.

또는 @brinary의 제안 덕분에

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

2014년 10월 편집.@cade Roux에서 언급했듯이 SQL 2012에는 다음과 같은 기능이 내장되어 있습니다.
DATEFROMPARTS(year, month, day)
같은 일을 하는 거야

2016년 10월 3일 편집(@bambams가 이를 알아차리고 @brinary가 이를 수정해 준 덕분에) 마지막 솔루션에서는 by@brinary.dos가 먼저 년 추가를 수행하지 않으면 윤년 동안 작동하지 않는 것으로 보입니다.

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

SQL Server 2012에는 오랫동안 기다려 온 새로운 DATE FROMPARTS 기능이 있습니다(DATEADD 기반 솔루션에 대한 저의 주된 반대입니다).

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

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

또는

DATEFROMPARTS(@y, @m, @d)

가정하다y, m, d전부int, 그럼?

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

SQL Server 2012 이상에 대한 다른 답변을 참조하십시오.

또는 단일 날짜 추가 함수를 사용할 수도 있습니다.

DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011

SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)

SQL Server 2012에는 부품을 기반으로 날짜를 생성하는 기능이 있습니다(DATE FROMPARTS).그 외의 멤버에게는, 부품으로부터 날짜를 결정하는 db 함수가 있습니다(고맙습니다 @Charles).

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

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

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

포맷 목록은 http://msdn.microsoft.com/en-us/library/ms187928.aspx 에서 확인할 수 있습니다.

다른 답이 "정답"으로 선택된 후 업데이트:

이 제한을 표시하지 않고 서버의 NLS 설정에 따라 명확하게 다른 답변을 선택하는 이유를 잘 모르겠습니다.

를 사용할 수도 있습니다.

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

ver.2012 및 Azure 이후 SQL에서 작동SQL

명시적 시작점 '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

문자열을 포함하지 않는 경우는, 다음의 조작도 가능합니다(함수에 넣습니다).

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')))

날짜시간 부품에서 날짜/시간이 필요한 경우 한 줄 솔루션을 추가합니다.

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

해라

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

Server 12를 을 권장합니다.CAST와와와 SET DATEFORMAT

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

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

그 끈을 어떻게 만들지는 당신에게 달려있다

OP에서 SQL 2005에 대한 답변을 요구하고 있는 것은 알고 있습니다만, 질문은 매우 오래된 것이므로 SQL 2012 이후를 실행하고 있는 경우에는 다음을 사용할 수 있습니다.

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

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

다음 쿼리를 사용해 보십시오.

    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

저는 개인적으로 서브스트링이 클렌징 옵션과 필요에 따라 스트링을 분할할 수 있는 기능을 제공하므로 서브스트링을 선호합니다.데이터는 'dd, mm, yyy' 형식이라고 가정합니다.

--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

언급URL : https://stackoverflow.com/questions/266924/create-a-date-from-day-month-and-year-with-t-sql

반응형