Tsql VarChar ضمنيًا إلى SmallDateTime
-
21-08-2019 - |
سؤال
عند تنفيذ ما يلي باستخدام قيد 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)