سؤال

أحاول الاستعلام عن جدول يحتوي على عمود "قيمة" Varchar (100). يمكن لهذا العمود الاحتفاظ بأي شيء من خطاب أو رقم أو في هذه الحالة تاريخ.

سيتم دائمًا إدخال التاريخ في الجدول باسم "Yyyy-MM-DD". ومع ذلك ، عندما أقوم بتشغيل الاستعلام التالي:

select * from myTable
where VALUE =  '2009-12-11' (Date, Format 'yyyy-mm-dd')  

أتلقى الخطأ التالي:

Invalid date supplied for myTable.VALUE.

مثال على جدول القيمة: (1 ، "122") (2 ، "أحمر") (3 ، "2009-12-11")

أي أفكار حول ما قد يسبب هذا؟

شكرًا!

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

المحلول

إذا تم الإعلان عن نوع البيانات على أنه varchar ، فيجب أن يعامله مثل السلسلة. حاول عدم تحديد أي شيء عن تنسيق التاريخ ، مثل

select * from myTable
where VALUE =  '2009-12-11'

نصائح أخرى

إذا قمت بتشغيل شرح في الاستعلام ، فيمكنك أن ترى أنه يتم إجراء قيمة حتى الآن قبل المقارنة مع القيمة المقدمة. إذا كان لديك عمود آخر يسجل بدقة نوع ما هو في القيمة ، فيمكنك إضافة ذلك إلى الفقرة التي ولن تحصل على الخطأ (انظر أدناه). خلاف ذلك ، اذهب مع توصية بيت.

select * from myTable
where VALUE =  '2009-12-11' (Date, Format 'yyyy-mm-dd')
and VALUE_TYPE = 'DATE';

Teradata حساب التاريخ الداخلي هو (year - 1900) * 10000 + (month * 100) + day.

لذلك إذا كان التاريخ هو 02/11/2009 (2 نوفمبر 2010) ثم

=(2009-1900) * 10000 + (11 * 100) + 2
=109 * 10000 + 1100 + 2
=1090000 + 1100 + 2    
=1090000
    1100
       2
----------
 1091102
----------

لذلك يتم تخزين 2 نوفمبر 2009 في Teradata كـ 1091102. يمكنك استخراجه بالتنسيق المطلوب عن طريق الصب (كما لديك في Varchar). أتمنى أن يساعدك هذا.

هل من الممكن أن VALUE هل الكلمة المحجوزة في تيراداما؟ إذا كان الأمر كذلك ، فأنت بحاجة إلى وضع ذلك في اقتباسات مزدوجة:

select * 
from myTable
where "VALUE" = '2009-12-11'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top