tsql varchar는 암시 적으로 SmallDateTime입니다
-
21-08-2019 - |
문제
반환 된 결과에 대한 smallDateTime 제약 조건을 사용하여 다음을 실행할 때는 결과가 없습니다.
Execute sp_proc @DateOfBirth = '01/01/1900'
또는
Execute sp_proc @DateOfBirth = '1900-01-01'
그러나 다음 Varchar 인수를 사용할 때 갑자기 2000 년 1 월 1 일에 해당하는 결과를 얻을 수 있습니다. SmalldateMe의 암시 적 변환은 MM/DD/YYYY 날짜와 MM/DD/YY 날짜 만 작동하지 않습니까?
Execute sp_proc @DateOfBirth = '01/01/00'
이것은 01/01/2000 생일에 대한 모든 결과를 반환합니다!
CREATE PROCEDURE [dbo].[sp_proc]
-- Add the parameters for the stored procedure here
@DateOfBirth SmallDateTime = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT *
FROM
view_People
WHERE
FirstName LIKE '%' + IsNull(@FName ,FirstName) + '%'
AND
LastName LIKE '%' + IsNull(@LName,LastName) + '%'
AND
DOB = IsNull(@DateOfBirth,DOB)
AND
SSN = IsNull(@SSN,SSN)
해결책
"01/01/00"은 "에 따라 변환됩니다."두 자리 연도 컷오프"옵션. 그래서 2000 년 1 월 1 일이됩니다.
'1900-01-01'을 보내면 코드가 1900 년 1 월 1 일 Dob = 01 인 경우에만 결과를 얻을 수 있습니다.
그 외에는 광고대로 작동합니다. 달리기를 원하지 않는 한 Execute sp_proc @DateOfBirth = DEFAULT
DOB를 무시하도록 강요합니다
다른 팁
기술적으로 다음의 출력을 비교해야합니다.
Execute sp_proc @DateOfBirth = '01/01/00'
에게:
Execute sp_proc @DateOfBirth = '01/01/2000'
또는
Execute sp_proc @DateOfBirth = '2000-01-01'
yyyymmdd (대시 없음)와 같은 안전한 형식을 사용하십시오.
이것들을 실행하여 무슨 일이 일어나는지 확인하십시오
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
제휴하지 않습니다 StackOverflow