سؤال

أحتاج إلى تحديد حسب التاريخ في استعلام SQL، على سبيل المثال

SELECT * FROM foo WHERE date = '2009-09-09'

يعمل هذا الاستعلام في قاعدة بيانات اختبار Hypersonic الخاصة بي، ولكن ليس Oracle، والذي يتطلب:

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

هل هناك طريقة لتحديدها حسب التاريخ بشكل موحد عبر هاتين قواعد البيانات؟

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

المحلول

لقد وجدت الإجابة - يمكنك إنشاء وظيفة to_date في hypersonic ثم يعمل الاستعلام الثاني في كليهما. على سبيل المثال، اجعل الفصل:

public class Date {
    public static String toDate( String value, String format ) {
        return value;
    }
}

والاستعلام

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

يعمل في كليهما.

نصائح أخرى

يمكنك تجربة قاعدة بيانات H2 الخاصة بك في قاعدة بيانات الذاكرة (http://www.h2database.com.). يجب أن يكون لائق وضع كوكبس أوراكل.

يدعم HSQLDB 2.0 حرفي تاريخ ANSI مثل أوراكل. لذلك إذا كنت تستطيع الترقية إلى HSQLDB 2.0، يمكنك استخدام:

حدد * من foo حيث date_column = تاريخ "2009-09-09"

في كلا قاعدة البيانات (في الواقع الكثير من قواعد البيانات حتى)

"التاريخ =" السلسلة الحرفية "" المسند في أوراكل لا ينصح عادة - فهو حساس لإعدادات nls_date_format وغالبا ما يؤدي إلى سوء فهم ما تبحث عنه في مجموعة النتائج (في مثالك أعلاه هل تريد جميع السجلات اليوم أو تلك التي تم إنشاؤها بالضبط في منتصف الليل؟)

إذا كنت بحاجة إلى سلسلة استعلام موحدة لكل من قواعد البيانات، فقد تقوم بإعادة تسمية الجدول في Oracle وإنشاء طريقة عرض باسم Foo وإلقاء نموذج بيانات التاريخ إلى Varchar2 في منطق الرؤية. ربما تحتاج إلى إضافة فهرس يستند إلى الوظيفة إلى الجدول للسماح بالبحث الفعال على قيمة إعادة صياغة.

إذا استطعت، يمكنك تعيين NLS_Date_Format في جلسة Oracle، وبهذه الطريقة لا تحتاج إلى استخدام وظيفة To_Date، ستقوم Oracle بذلك من أجلك وراء الكواليس.

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
DD/MM/YYYY

SQL> create table nls_date_test ( id number(10) , date_entered date );

Table created.

SQL> insert into nls_date_test values ( 1 , '31/05/2009' );

1 row created.

SQL> insert into nls_date_test values ( 2 , '30/05/2009' );

1 row created.

SQL> select * from nls_date_test where date_entered = '2009-09-09';
select * from nls_date_test where date_entered = '2009-09-09'
                                                  *
ERROR at line 1:
ORA-01861: literal does not match format string


SQL> alter session set nls_date_format = 'YYYY-MM-DD';

Session altered.

SQL> select * from nls_date_test where date_entered = '2009-05-30';

        ID DATE_ENTER
---------- ----------
         2 2009-05-30

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
YYYY-MM-DD

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