قاعدة بيانات SQL غير محددة لإرجاع قائمة تاريخ الميلاد المخزنة كطابع زمني

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

سؤال

إذا كنت بحاجة إلى البحث في تاريخ الميلاد الذي يتم تخزينه بدون الساعات والدقائق ولكن التاريخ الذي يجب أن أبحث فيه يتضمن الساعات والدقائق، فما هي أفضل طريقة لإرجاع جميع الصفوف حيث يتم مطابقة التاريخ في اليوم والشهر والسنة فقط

أي.
تم تخزينه كـ 01-JAN-50 10.22.06.000000000
التاريخ المحدد 01 يناير 2050 10.22.06.010101120

إذا استخدمت التاريخ مع الساعات والدقائق، فسيقوم SQL بإرجاع الصفوف ذات الطابع الزمني الدقيق فقط وليس تلك الخاصة باليوم والشهر والسنة فقط.

يحتاج SQL إلى العمل على Oracle وSQLServer وMySQL وDB2.

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

المحلول

وأوراكل نوع التاريخ ترجع إلى ما قبل النسخة القياسية SQL (كما يفعل ينفورميكس)، ومما يجعل هذا من الصعب للغاية - إن لم يكن من المستحيل - أن تفعل بطريقة-DBMS محايد. وبطبيعة الحال، هناك مسألة "لماذا تمثيل البيانات المختارة تشمل الوقت".

في SQL القياسية، وتقنية واضحة سيكون للادلاء الطابع الزمني إلى DATE. ونحن أيضا لم يكن لديك تفسير واضح من البيانات التي لديك للبحث مع.

SELECT CAST(DateOfBirth AS DATE), ...other columns...
    FROM TheMysteryTable         -- Why do people hate giving tables names?
    WHERE CAST(DateOfBirth AS DATE) =
          CAST(TIMESTAMP '1950-01-01 10.22.06.010101120' AS DATE)

ولكن هذا يفترض أن تكتب "التاريخ للبحث مع 'كما حرفي. إذا كان متغير المضيف، ثم نوع المتغير المضيف يجب أن يكون تاريخ، وليس الطابع الزمني. وينبغي أن العمود DateOfBirth ربما يكون تاريخا، وليس الطابع الزمني. يجب عدم استخدام الطابع الزمني ما لم يكن دوام جزئي هو ذات الصلة - ما فرطت تخزين ويضيع الوقت حساب

ملاحظة أنه نظرا للقوالب، فإنه من غير المحتمل أن DBMS سوف تكون قادرة على استخدام أي مؤشرات أو أي شيء. إذا كان عاقل أنواع، ثم الاستعلام سيكون ببساطة:

SELECT DateOfBirth, ...other columns...
    FROM TheMysteryTable
    WHERE DateOfBirth = DATE '1950-01-01'

نصائح أخرى

وأما أي حل سوف يتطلب التلاعب في التاريخ والتاريخ والوقت الأجسام، ثم لن يكون هناك حل الملحد نظام - سوف يكون كل وظائف مختلفة لتلك الكائنات

والحل الأفضل، وغيرها من التجريد قاعدة البيانات، سيكون لجولة قبالة الكائن التاريخ والوقت يجري استخدم لأول مرة، ثم لا بد من شرط مقارنة SQL عام فقط والتي سوف تكون وظيفية في جميع بالواجبات المدرجة.

وليس هناك تنسيق التاريخ ANSI، ولا التلاعب السلسلة. سيتم تشغيل أي رمز فقط في بعض لRDBMS، إن لم يكن واحد فقط.

ومع ذلك، إذا كنت الحصول على التاريخ المحدد الخاص بك خارج RDBMS الخاص بك (مثلا، PHP، جافا، وما إلى ذلك)، ويهمني ان توحي التعقيم قبل إرساله في الاستعلام. ثم يمكنك مقارنة السلسلة إلى السلسلة، والذي يجب أن تعمل في أنظمة كلها تقريبا.

كما أشار آخرون، فإن أنظمة RDBMS متباينة للغاية عندما يتعلق الأمر بالتعامل مع أوقات التاريخ. لو لقد اتبعوا بالفعل معيار ANSI-92، فيجب أن يعمل ما يلي:

SELECT
     <column list>
FROM
     <table name>
WHERE
     CAST(birth_date AS DATE) = CAST(search_date AS DATE)

لن تكون هذه هي الطريقة الأكثر فعالية للقيام بذلك، لأنها ستمنع استخدام الفهارس في التاريخ لمعظم الأنظمة.الأتى قد العمل من أجل قاعدة بيانات متوافقة تمامًا مع ANSI-92:

SELECT
     <column list>
FROM
     <table name>
WHERE
     birth_date >= CAST(CAST(search_date AS DATE) AS DATETIME) AND
     birth_date < CAST(CAST(search_date AS DATE) + 1 AS DATETIME)

استخدم EXTRACT ()

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