2017-01-13 2 views
2

난 그냥이 우연히 일어난 및 기술적 인 설명은 찾을 수 없습니다 :

SQL 서버에서 2014 :

SELECT CAST('' AS DATETIME); 
1900-01-01 00:00:00.000 

SELECT CAST(0 AS DATETIME); 
1900-01-01 00:00:00.000 

SELECT CAST('' AS DATE); 
1900-01-01 

SELECT CAST(CAST(0 AS DATETIME) AS DATE); 
1900-01-01 

SELECT CAST(0 AS DATE); 

메시지 529, 수준 16, 상태 2, Line 4
데이터 형식 int에서 날짜로의 명시 적 변환은 허용되지 않습니다.

DATEDATETIME 일에 빈 문자열에서 CAST을 수행하지만 0에서 만 DATETIME로 작동?

나는 기술적 인 설명 그것은 타임 스탬프 행동에서 어쩌면이다

+5

https://msdn.microsoft.com/en-us/library/ms191530.aspx – dfundako

답변

3

Microsoft가 지원하기로 결정한 문제입니다. 날짜/시간은 숫자 값에서의 변환을 허용하지 않지만 날짜/시간에 대한 데이터 변환은 숫자 값에서 허용된다는 사실이 다소 다릅니다. SQL 서버 내에서 먼저 0을 0.000000000과 같은 숫자 값으로 변환 한 다음 해당 숫자와 동일한 날짜 시간으로 변환해야합니다. 이 예제에서는 현재 날짜를 숫자 값으로 변환 한 다음 다시 datetime으로 변환 할 수 있음을 보여줍니다. 그러나 날짜로 변환하면 오류가 발생합니다. 값 0.5를 날짜로 변환하려고 시도했을 때 발생할 수있는 반올림 문제를 피할 수있을 것입니다. 이 경우, 암시 적으로 0.5를 1900-01-01 또는 1900-01-02 날짜로 변환하도록 SQL 엔진을 프로그래밍하십시오. 이 경우 어떤 날짜를 반환해야하는지 자의적으로 결정해야합니다.

이 작동 :

--produces a numeric value like 42746.97660799 
select cast(getdate() as numeric(18,8)) 

select cast(42746.97660799 as datetime) 

을이받은 같은 오류가 발생하는 동안 : 날짜에 숫자 데이터 유형에서

select cast(42746.97660799 as date) 

메시지 529, 수준 16, 상태 2, 5 호선 을 명시 적 변환이 허용되지 않습니다.

+0

좋은 점, 나는 그렇게 생각하지 않았다. int를 날짜로 변환 할 수 있고 숫자를 int로 변환 할 수 있으면 숫자 (비 int)를 날짜로 변환하여 임의의 라운드를 생성 할 수 있습니다. 우수 답변! – Helvio

0

에 관심이 있어요. datetime에 0을 캐스트 한 다음 캐스트 할 수 있습니다. 또한 Microsoft의 규칙입니다. 국가 규칙이 아닙니다.

+0

포스터에서 : _ 기술적 인 설명에 관심이 있습니다 _ – dfundako

+0

중요한 정보를 추가하고 0을 DATETIME으로 캐스팅 한 다음 DATE까지 작동합니다. 나는 그것을 질문에 추가 할 것이다. – Helvio

0

SQL Server가 지원하는 것 이외의 기술적 인 설명이 명확하지 않은 것 같습니다. SQL 서버는 모든 데이터 유형의 순위를 지정합니다. Data Type Precendence. 암시 적 변환은 시간이지나면서 진화했습니다. 로직과 진화를 잘 설명하는 Craig Friedman의 Microsoft 블로그가 있습니다. More on Implicit Conversions. @hamid_reza 호밥이 나타내는 것은 본질적으로 사실입니다. SQL 서버는 int를 datetime으로 변환하는 것을 지원합니다. Datetime은 날짜보다 높은 우선 순위이므로 일별로 datetime을 날짜로 변환 할 수 있습니다. SQL 서버는 @dfundako의 주석에 게시 된 지원 매트릭스에 표시된대로 int의 날짜를 암시 적 또는 명시 적으로 변환하지 않습니다.