سؤال

وفق MSDN نطاق نوع بيانات التاريخ هو 1 يناير 1753 وحتى 31 ديسمبر 9999

في SQL2005 ما يلي مثير للاهتمام:

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date

if (isnull(@date,0) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

تغيير التاريخ إلى '1/1/1901 12:00:00 AM' وفجأة isnull(@date,0) هو 0.

ماذا ينقصني؟

(تحرير) نطاق زمني ثابت لـ sql2005، رابط لـ sql2005 BOL

هل كانت مفيدة؟

المحلول

وجرب هذا:

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'

SELECT @date, CASE WHEN @date IS NULL THEN 'date is null' ELSE 'date not null' END

نصائح أخرى

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date

if @date is null SELECT 'date is null' ELSE SELECT 'date not null'

وISNULL() هي وظيفة التحويل. وليست هذه هي الاختيار إذا كانت قيمة NULL.

وموعد له تمثيل رقمي. التمثيل الرقمي '1/1/1901 12:00:00 AM' يحدث أن تكون 0، على SQL Server.

وأنت لا يمكن مقارنة نتيجة ISNULL(@date,0) إلى 0 دون أن تفقد القدرة على التمييز بين التاريخ الذي يمكن أن تكون ممثلة على النحو 0 والتاريخ الذي هو NULL.

ووسطر من التعليمات البرمجية أدناه مضلل:

if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

وهذا الخط بإرجاع 0 إذا @date == 0، <م> لا عندما يكون لاغيا. يتم تخزين التاريخ الذي حددته ك 0 في التاريخ والوقت.

SELECT convert(datetime, 0)

لمعرفة ما أعنيه!

حاولت هذا:

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is zero' ELSE SELECT 'date not equal to zero (THIS PRINTS)'
if (isnull(@date,0) = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not equal to zero'
if (@date = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not 365'

SET @date = '1/1/1900 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
if (@date = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'

هنالك لا شئ خطأ مع ISNULL ولا مع COALESCE.المشكلة هي أنك تقارن بالصفر، وتخدع نفسك بالاعتقاد بأن ISNULL بدأ العمل.جرب الكود الخاص بي، وتأكد من أن ISNULL تُرجع القيمة الصحيحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top