필자는 앱에서 반환 한 모든 데이터 시간에 8601 개의 datetimes를 사용할 것이라고 결정했습니다. 갑자기 특정 proc에서 getdate()가 중간에 T가있는 datetime을 반환하지 않습니다. FOR XML PATH를 사용하여 datetime을 포함하는 집합을 XML으로 변환한다는 것을 언급해야합니다. 일반적으로 datetime을 포함하는 테이블을 xml로 변환하면 8601 형식의 날짜가됩니다. 하지만 한 경우에는 그렇지 않습니다.내 126 datetime이 중간에 T가 돌아 오지 않는 이유는 무엇입니까?
select convert(datetime, getdate(), 126) -- returns 2010-01-25 10:14:35.923
을하지만이 NVARCHAR로 캐스팅하면 나는 T를 얻을! :
select (cast(getdate() as datetime)) -- returns 2010-01-25 10:13:46.033
그래서 내가 직접 그렇게처럼 변환
SELECT CONVERT(NVARCHAR(30), GETDATE(), 126) -- returns 2010-01-25T10:15:29.633
내가 낯선 것은 조합으로이 버전을 여러 개 선택하면 T 버전이 사라진다는 것입니다. 그러나 노동 조합없이 선택하면 T 버전 (마지막 버전)이 남아 있습니다.
-- returns 4 rows of 2010-01-25 10:15:57.333
select getdate() union all
select (cast(getdate() as datetime)) union all
select convert(datetime, getdate(), 126) union all
SELECT CONVERT(NVARCHAR(30), GETDATE(), 126)
나는이 일이 발생할 수있는 원인을 알지 못합니다. 저는 8601 개의 날짜가 로케일에 독립적이라고 생각했기 때문에 그렇게 생각하지 않습니다.
참조 ("YYYY-MM ISO 형식 : MI : ss.mmm"126에 대한) : http://msdn.microsoft.com/en-us/library/ms187928.aspx
(노조 예제에서) nvarchar 쿼리를 먼저 입력하면 모든 것이 datetime으로 변환됩니다 .. weird .. (SQL SERVER 2005) –
내 테스트 설정이 좋지 않다고 생각합니다. 아직도 나는 (실제 proc) 내 결과에서 이상한 것을보고 있었다. 문제는 XML에 있습니다. FOR XML PATH를 수행하면 변환기는 8601 개의 날짜를 넣습니다. 나는 이것을 포함하도록 질문을 편집했다. 제 경우에는 SQL보다 다르게 datetimes를 변환하는 datalayer가있었습니다 (일부 경우). – jcollum
@Gaby : 맞습니다. 데이터 유형을 결정하는 첫 번째 결과는 아니며 형식 우선 순위의 규칙입니다. 나는 대답에서 그것을 바꿨다. – Guffa