문제

반환 된 결과에 대한 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top