سؤال

عند تنفيذ ما يلي باستخدام قيد Smalldatetime على النتائج التي تم إرجاعها، أحصل على صفر نتيجة:

Execute sp_proc @DateOfBirth =   '01/01/1900' 

أو

Execute sp_proc @DateOfBirth =   '1900-01-01' 

ولكن عند استخدام الوسيطة varchar التالية فجأة أحصل على نتائج تتوافق مع 1 يناير 2000.هل لا يعمل التحويل الضمني Smalldatetime لتواريخ 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" استنادًا إلى "قطع سنة مكونة من رقمين" خيار.وبذلك يصبح 01 يناير 2000.

إذا أرسلت "01-01-1900"، فسيظهر الرمز الخاص بك أنك لن تحصل على نتائج إلا إذا كان تاريخ ميلادك = 01 يناير 1900.

بخلاف ذلك، فهو يعمل كما هو معلن.إلا إذا كنت تريد الركض 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