لماذا لا يقوم SQL Server تلقائيا بتحويل التاريخ إلى DateTime لأغراض المقارنة؟

StackOverflow https://stackoverflow.com/questions/1701311

سؤال

أحب نموذج بيانات التاريخ الجديد في SQL Server 2008، ولكن عندما أقارن حقل تاريخ إلى حقل DateTime على خادم مرتبط (SQL 2005، في هذه الحالة)، مثل هذا:

DECLARE @MyDate DATE
SET @MyDate = CONVERT(DATE, GETDATE())

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate

أحصل على هذا الخطأ:

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".

من الواضح أن "المقياس غير صالح" من الواضح أن العميل الأصلي يمر في تاريخ بيانات التاريخ مرة أخرى إلى الخادم المرتبط، وبما أنه SQL 2005، فإنه لا يعرف ماذا يفعل به. تشغيل هذا الاستفسار نفسه مقابل خادم 2008 يعمل فقط على غرامة - SQL Server قادر على مقارنة أنواع البيانات وتاريخ DateTime دون مشكلة.

فيما يلي سؤالي - هل هناك سبب أن العميل الأصلي لا يقوم بتحويل قيمة التاريخ تلقائيا من "2009-11-09" إلى تاريخ "2009-11-09 00: 00: 00.000 'بحيث الإصدار السابق من لن يخنق SQL Server؟

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

المحلول

الهيكل الداخلي ل DateTime (2005) والتاريخ / الوقت / DateTime2 DateTimeOffset (2008) يختلفان تماما مع بعضها البعض، كما هو الحال مع مقارنات أخرى يجب وضع البيانات في نفس النوع عند المقارنة. لذلك سيتم إجبار العميل الأصلي على إجراء مثل هذا التحويل.

يمكن أن يكون العميل الأصلي سخية والقيام بالتحويل الضمني لك ولكنه على قدم المساواة "عنصر أقل مفاجأة" أن المنتجات تميل إلى العمل يجب أن تشير إلى أن إلقاء نوع في SQL 2005 أنه لا يفهم مهما أنه يجب رفضه. هناك عدد من الأخطاء الدقيقة التي يمكن أن تنزلق من ذلك بالتأكيد.

يجب أن يكون SAME ينطبق على إلقاء Datetime2 (7) في SQL 2005، هل نتوقع أنه سيتوقف عن دقة 100NS مرة أخرى إلى 3.33ms أو رمي والخطأ - أفضل الخطأ وصنع / قبول صريح صريح.

نصائح أخرى

لا أستطيع إلا أن أخمن أن هذا هو ل 2009-11-09 00:00:00.000 ليست محايدة من المنطقة الزمنية وسوف يكون سبب المزيد من الأخطاء الدقيقة. أرجوا أن تصحح لي إذا كنت مخطئا.

يمكنك تحقيق ذلك باستخدام مجموعة تغيير جلسة التغيير nls_date_format = 'mm / dd / yyyy hh: mi: ss am'؛ هذا هو حل Temproray، إذا كنت تعمل على UNIX، فيمكن القيام بهذه الإعداد بشكل دائم في .profile.

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