2010-06-23 9 views
0

SQL 스크립트에 다음과 같은 정수 유형 값이 있습니다 : @year, @month, @day. 이제는 이들을 datetime 값으로 변환하려고합니다. 쉬워야 할거야, 그렇지?int 값을 사용하여 SQL에서 날짜/시간을 설정합니까?

글쎄, 난 그냥 SQL 문서를 통해 갔다 및 문자열을 변환 한 다음 날짜 시간에 이외의 이렇게 할 어떤 방법을 찾을 수 없습니다 매우 놀랐습니다.

declare @dt datetime 
set @dt= convert(varchar,@year)+'/'+convert(varchar,@month)+'/'+convert(varchar,@day) 

끔찍한입니다! 확실히 int 값에서 datetime으로 직접 변환하는 방법이 있어야합니까?

+0

를 그들이 처음에 있어야로 VARCHAR와 같은 값을 정의하지 왜. 이들은 zip이 문자열 데이터이거나 전화 번호가 문자열 데이터 인 것처럼 정수 데이터가 아닌 문자열 데이터입니다. – HLGEM

+1

@HLGEM : 거기에는 약간의 차이가 있다고 생각합니다. ZIP 또는 전화 번호에 대한 산술 연산은 거의 사용하지 않지만, 년/월/일의 경우에는 해당되지 않습니다. 이 숫자는 해당 월이 시작된 이후의 일수, BC/AD 전환 후 연수, 연초 이후의 월 수를 나타냅니다. ZIP 또는 전화 번호는 단지 숫자 일뿐입니다. –

+0

나는 datetime 데이터 형식을 사용하여 모든 날짜 계산을 수행하고 나머지는 표시에만 사용합니다. 그리고 달과 일은 일반적으로 선행 제로가 필요하므로 int로 저장하는 것이 가장 좋습니다. 어쨌든, 그 값을 날짜 데이터 형으로 변환하기를 원할 경우, 그 값을 처음으로 정의해야합니다. – HLGEM

답변

1
상자 밖으로

하지,하지만 당신은 예를 들어,을하는 UDF 만들 수 있습니다

create function ints2date (@year int, @month int, @day int) 
returns datetime 
as begin 
    declare @foo varchar (10) 

    set @foo = convert (varchar, @year) + '-' + 
       convert (varchar, @month) + '-' + 
       convert (varchar, @day) 
    return convert (datetime, @foo) 
end 
go    

select dbo.ints2date (2000,1,1) 

또한보다 복잡한에 그것을 할 수 있습니다 (그러나 아마 약간 빠른) 방식 DATEADD 사용/날짜 부분을 . 이 예는 Create a date with T-SQL (stackoverflow.com)에서 확인할 수 있습니다.

+0

진심으로 ?? MS * 정말 * 날짜 부분에서 날짜를 생성하기위한 원시 메서드를 제공하지 않았다? 날짜를 생성하기 전에 정수를 문자열로 변환해야합니까? 나는 절대적으로 ** 소름 끼치게된다 **! 예, 사실을 감안할 때 UDF를 사용하는 것이 길일 것입니다. 그러나 나는 그 모든 어리 석음에 완전히 말문이 막 듭니다. AFAI는 SQL Server의 큰 버그라고 우려하고 있습니다. –

+0

아니요,이 작업을 수행하지 않습니다. T-SQL을 사소한 성가신 일입니다. YYYY-MM-DD 형식으로 날짜를 변환하는 것이 가장 쉽습니다. 공정하게하기 위해 오라클의 TO_DATE()가 상당히 편리하다고 생각하지 않습니다. – ConcernedOfTunbridgeWells

+0

OK, 내가 원하는 바가 아니지만 정확하고, 첫 번째 대답을 얻은 이후로 나는 당신에게 신용을 줄 것이다. –

1

다음과 같이 문자열로 변환하지 않고도이 작업을 수행 할 수 있습니다. 그것은 좋은 것 하나의 기능은 아니지만, 작동 :

DECLARE 
    @year SMALLINT, 
    @month TINYINT, 
    @day TINYINT, 
    @d  DATETIME 

SET @year = 2010 
SET @month = 6 
SET @day = 23 
SET @d = '1900-01-01' 

SELECT 
    DATEADD(dy, @day - 1, DATEADD(mm, @month - 1, DATEADD(yy, @year - 1900, @d))) 
+0

네,하지만 여전히 문자열 변환을 사용하여 원래 값인' @ d' ... –

+0

@d는 datetime입니다. 그것이 당신에게 성가대 연산자의 반대편에 문자열 리터럴처럼 보이는 것을 가지고 있다면, 당신은 스크립트에서 그것을 완전히 제거 할 수 있고 마지막 함수에서 0을 그 자리에 넣을 수 있습니다. –

관련 문제