2017-12-14 9 views
0

내가 내 로컬에이를 실행하면 다음 스크립트이유는 SQL 서버의 날짜 형식 타임 스탬프

SELECT cast('2017-12-14 14:30:41.007' as datetime) 

를 사용하여 SQL 서버에서 날짜 필드에 날짜를 포함하는 VARCHAR로 변환하려고 해요로 날짜 변환에 영향을 미치지 않습니다 DateFormat myd를 사용하는 컴퓨터가 제대로 작동하고 유효한 datetime을 반환했습니다. '41.007 : 30 2017년 12월 14일 14' "MYD"에서 유효한 날짜가 아니라에서 내가 DATEFORMAT의 DYM를 사용하여 내 서버에서이 명령을 실행하면 서버는

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. 

이 왜 다음 오류를 반환 "dym"이나 "myd"날짜가 아니더라도 "dym"?

내가

+1

언어 중립적 형식을 사용하지 않았기 때문에. yyyymmdd를 사용하십시오. hh : nn : ss – GuidoG

+1

http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes – GuidoG

+1

형식이 실제로 SQL Server에 의해 'yyyy'로 해석되는 일부 (실제로는 대부분의 언어) -dd-mm'. https://www.mssqltips.com/sqlservertip/5206/sql-server-datetime-best-practices/ –

답변

0

그것은이다. 당신이 11에 14을 변경하고이 스크립트를 실행하면 그 차이를 볼 수 있습니다 : 모든 시간 형식은 날짜와 시간의 중간에 T를 넣어위한

SET DATEFORMAT myd 
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime)) 

SET DATEFORMAT dym 
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime)) 

/* 

Output: 
12 
11 

*/ 

사물의 일관성을 확인합니다. 이것은 SQL 서버가 날짜가 ISO8601 형식이라고 생각하게합니다.

SET DATEFORMAT myd 
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime)) 

SET DATEFORMAT dym 
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime)) 

/* 

Output: 
12 
12 

*/ 
0

'2017-12-14 14:30:41.007'는 시간을 밀리 초 기본 표준 ODBC 표준을 따르도록 보인다 SQL 서버에서 무슨 일이 일어나고 있는지 이해하기를 원하기 때문에 BTW, 내가 부탁 해요 문제에 대한 주위에 작품을 발견, 날짜, datetime2 및 datetimeoffset입니다. 당신이 MS SQL을 사용하는 경우 문자열 매개 변수의 특정 스타일에 대처하기 위해 CONVERT을 사용할 수 있습니다 : SQL 서버가 한 달 번호로 (14)를 해석하고, 단지 12 개월이 있기 때문에

SELECT convert(datetime,'2017-12-14 14:30:41.007' , 121)