كيفية الحصول على قيمة المللي ثانية من حقل الطابع الزمني في فايربيرد مع دلفي 2007
-
07-07-2019 - |
سؤال
لدي قاعدة بيانات Firebird (تعمل على إصدار الخادم 2.1.3) وأتصل بها باستخدام Delphi 2007 باستخدام كائنات DBExpress (باستخدام برنامج التشغيل Interbase)
يبدو أحد الجداول الخاصة بي في قاعدة البيانات مثل هذا
CREATE TABLE MYTABLE
(
MYDATE Timestamp NOT NULL,
MYINDEX Integer NOT NULL,
...
Snip
...
PRIMARY KEY (MYDATE ,MYINDEX)
);
يمكنني أن أضيف إلى الجدول حسنًا، وفي Flame Robin يُظهر حقل الطابع الزمني على أنه يحتوي على قيمة مللي ثانية.
ولكن عندما أقوم بتحديد الكل (select * from MYTABLE
) على الجدول لا أستطيع الحصول على قيمة المللي ثانية، حيث يتم إرجاعها دائمًا كـ 000.
وهذا يسبب مشاكل كبيرة لأنه جزء من المفتاح الأساسي (للأسف لم أقم بتصميم الجدول وليس لدي صلاحية تغييره).
لقد حاولت ما يلي للحصول على قيمة المللي ثانية:
sql1.fieldbyname('MYDATE').AsDateTime;
sql1.fieldbyname('MYDATE').AsSQLTimeStamp;
sql1.fieldbyname('MYDATE').AsStirng;
sql1.fieldbyname('MYDATE').AsFloat;
لكنهم جميعًا يعودون في 14/09/2009 14:25:06.000 عند التنسيق.
كيف يمكنني استرداد المللي ثانية من الطابع الزمني؟
تحديث:في حال كان هذا يساعد أي شخص في المستقبل، فإليك برامج التشغيل التي جربتها لـ DBExpress والنتائج.
- Embarcadero - DBExpress Driver for Firebird (إصدار Delphi 2010 التجريبي) - المللي ثانية غير مدعومة في الطوابع الزمنية.
- Chau Chee Yang's - Dbexpress Driver for Firebird (دلفي 2007) - المللي ثانية غير مدعومة في الطوابع الزمنية.
- upscene - interxpress for Firebird (Delphi 2007) - يتم دعم مللي ثانية في الطوابع الزمنية.
- Devart - DBExpress برنامج Interbase (دلفي 2007) - يتم دعم المللي ثانية في الطوابع الزمنية.
المحلول
لا أعرف ما إذا كان Firebird يدعم فعليًا المللي ثانية، لكنني أعرف حقيقة أن برنامج تشغيل InterBase لـ Delphi 2007 لا يدعم ذلك.وذلك لأن InterBase لا يُرجع المللي ثانية في واجهة برمجة تطبيقات C الخاصة به؛على الرغم من أن InterBase يقوم بتخزين DateTimes بدقة أقل من مللي ثانية، فإن InterBase API ترجع الأوقات في بنية C TM التي لا تحتوي على حقل مللي ثانية.ولذلك، فإن برنامج التشغيل dbExpress المصمم لـ InterBase لن يدعم ذلك.لذلك، سوف تحتاج إلى تغيير برامج التشغيل كحد أدنى، على افتراض أن Firebird يدعم هذا بالفعل على الإطلاق.
نصائح أخرى
زميل لي (إدوين فان دير كران) فقط التحقق:يعمل مع FIBplus!
قام بالتحقق من الإصدار 6.9.6 من FIBPlus وFirebird 2.1.1.
قام بإدراج إدراج current_timestamp واستخرجه باستخدام FormatDateTime('dd-mm-yyyy hh:nn:ss:zzz', TestpFIBDataSetMYDATE.Value)
ثم استعاد التاريخ والوقت بما في ذلك المللي ثانية.
--جيروين
الأسئلة الشائعة حول فايربيرد رقم 305 يشرح كيفية التغلب على هذه المشكلة بسهولة عبر varchar CAST البسيط.
توجد برامج تشغيل Firebird dbx (يمكنك تجربتها):