استعلام التاريخ مع السبات على عمود الطابع الزمني في postgresql
-
23-09-2019 - |
سؤال
يحتوي الجدول على عمود الطابع الزمني. يمكن أن تكون قيمة العينة في ذلك 2010-03-30 13:42:42. مع Hibernate ، أقوم بعمل قيود على استعلام النطاق.
رسم خرائط السبات لهذا العمود هو كما يلي.
<property name="orderTimestamp" column="order_timestamp" type="java.util.Date" />
دعنا نقول ، أريد أن أعرف جميع السجلات التي لها تاريخ 30 مارس 2010 و 31 مارس 2010. يتم إجراء استعلام في هذا المجال على النحو التالي.
Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30");
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31");
Expression.between("orderTimestamp", fromDate, toDate);
هذا لا يعمل.
يتم تحويل الاستعلام إلى الطوابع الزمنية المعنية باسم "2010-03-30 00:00:00" و "2010-03-31 00:00:00". لذلك ، يتم تجاهل جميع السجلات في 31 مارس 2010.
قد يكون هناك حل بسيط لهذه المشكلة هو أن يكون تاريخ النهاية "2010-03-31 23:59:59." ولكن ، أود أن أعرف ما إذا كان هناك طريقة لمطابقة جزء التاريخ فقط من عمود الطابع الزمني.
أيضا ، هو Expression.between()
بما في ذلك كلا الحدود؟ الوثائق لا تلقي أي ضوء على هذا.
لا يوجد حل صحيح
نصائح أخرى
, ، أود أن أعرف ما إذا كان هناك طريقة لمطابقة جزء التاريخ فقط من عمود الطابع الزمني.
إذا كنت لا تريد طابعًا زمنيًا ، فاستخدم تاريخًا (ولا ينبغي أن تستخدمه type="date"
?).
أيضا ، هل التعبير.
يبدو أن سلوك SQL بين المشغل هو قاعدة البيانات المعتمدة. مع posgresql ، بين التعبير:
x BETWEEN y AND z
يعادل دلالة:
y <= x AND x <= z
أي شاملة.
"2010-03-31 23:59:59." من المحتمل أن تكون حالة الحدود خطيرة: إذا كانت هناك معاملة في النظام بين 23:59:59 و 00:00:00 ، فستفتقدها. إذا كان لديك ما يكفي من المعاملات يوميًا وفترة طويلة بما يكفي ، فسوف ينهار التقرير وسوف تقضي ساعات لمعرفة السبب.
postgresql between
يشمل الحدود لذلك لن يكون من الآمن تعيين تاريخ الانتهاء على 2010-04-01 00:00:00. استخدم LT () و GT () للتأكد.
ربما يمكنك إلقاء OrderTimestamp إلى موعد. HQL لديه الدعم لهذا.
استخدم Cast (Your_data ، التاريخ) ، تذكر أن ARG الثاني لوظيفة الممثلين يجب أن يكون أقل ، أو لن يعمل.
ATT.: صموئيل مايكون