2012-02-21 5 views
-2

쿼리 분석기에이 코드를 입력하고 F5 키를 누릅니다.SQL Server dateformat 문제가있는 동작

declare @aaa datetime 
set @aaa='01/12/2011' 
set dateformat dmy 
select month(@aaa) 

1을 제공합니다. 다시 F5를 누르면 12가됩니다. 왜?

+4

쿼리 분석기? 내가 10 년 동안 시간을 ​​거듭 돌아 본 적이 있니? –

+1

** 언어/위치 독립적 ** 문자열 기반 날짜 (예 : ** ISO-8601 ** 표준 형식 'YYYYMMDD')를 사용하는 경우 - 예 : 'set @aaa = '20111201 '' - 원하는 날짜 형식으로 여러 번 전환 할 수 있습니다. ** 항상 ** 12 월을 얻을 것입니다 ...... –

답변

1

이것은 set dateformat dmy 라인이 스크립트의 중간에 있기 때문입니다.

은 첫 번째 'F5'에 대한 초기 할당 후 날짜 형식을 전환되지만 당신이 그것을 일관되게 12 각을 반환해야합니다 첫 번째 줄 수 있도록 다음이 두 번째 'F5'

동안 지속된다 시간

set dateformat dmy은 문자열 '01/12/2011'이 datetime으로 구문 분석되는 방식에 영향을주기 때문에 set @aaa='01/12/2011' 행의 차이를 만듭니다.

첫 번째 실행에서 @aaa는 실제로 '12-Jan-2011 '날짜를 포함하지만 set dateformat dmy 이후에는 '01 -Dec-2011'날짜가 포함됩니다.

+0

dateformat dmy를 설정하십시오. 그것은 거기에 있어야합니다. @aaa는 저장 프로 시저가 수신 한 매개 변수입니다. 처음 두 줄은 디자인 타임에 절차를 시도하는 것입니다. – Florin

+1

@ 플로린 : 질문에 언급되지 않았습니다. 정보가 많을수록 답을 얻을 수 있습니다. 저장된 proc는 어디에서 호출 되었습니까? –

+0

확인. 죄송합니다. 어디 보자. 이 절차는 다음과 같습니다. 프로 시저 만들기 [dbo]. [테스트] \t @d 날짜 시간 AS BEGIN \t SET NOCOUNT ON; \t 설정에 dateformat의 DMY \t 선택 월 (@dDate) END 당신이 프로 시저를 실행하는 경우 1 대신 12 – Florin

1

처음으로 코드를 실행했기 때문에 날짜가 1 월 12 일로 내부적으로 저장되었습니다. 설정이 세션에 집중되어 다시 실행되었으므로 변수를 다시 선언하고 이번에는 12 월 1 일로 해석됩니다. 날짜가 이미 해석되어 입력 한대로 내부적으로 저장되지 않기 때문에 설정 설정은 MONTH()과 같은 datepart 함수에 영향을주지 않습니다.

지역 및 모호한 서식으로 날짜 리터럴을 선언하는 대신 항상 안전하고 분명한 형식을 사용해야합니다. 날짜

yyyymmdd 
yyyy-mm-ddThh:mm:ss 

: 날짜/smalldatetime으로 들어 꼭

yyyy-mm-dd 

당신이 친절하지만 혼란 형식으로 날짜를 표시하려면

는 할 프리젠 테이션 계층에서 그. 그러나 SQL Server와 혼동하지 마십시오. this blog postthis article by Tibor Karaszi을 읽어주십시오.

관련 문제