سؤال

أحتاج إلى إضافة 30 دقيقة إلى القيم الموجودة في عمود تاريخ Oracle.أفعل ذلك في بيان SELECT الخاص بي عن طريق تحديد

to_char(date_and_time + (.000694 * 31)

الذي يعمل بشكل جيد في معظم الأوقات.ولكن ليس عندما يكون الوقت على الحدود صباحًا/مساءً.على سبيل المثال، إضافة 30 دقيقة إلى 12:30 [وهو PM] يعود 1:00 وهو صباحا.الجواب الذي أتوقعه هو 13:00.ما هي الطريقة الصحيحة للقيام بذلك؟

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

المحلول

وجميع من الإجابات الأخرى على حق في الأساس ولكن لا أعتقد أن أي شخص أجاب مباشرة سؤالك الأصلي.

وعلى افتراض أن "DATE_AND_TIME" في المثال الخاص بك هو عمود مع نوع التاريخ أو الطابع الزمني، وأعتقد أن كل ما تحتاجه لتغيير هذا:

to_char(date_and_time + (.000694 * 31))

وعلى هذا:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

وهذا يبدو وكأنه تنسيق التاريخ الافتراضي الخاص بك يستخدم "سمو" رمز للساعة، وليس "HH24".

وأيضا، وأعتقد أن فترة ولايتكم المستمر على حد سواء مربكة وغير دقيق. أعتقد أن ما قمت به هو حساب أن (0.000694) عبارة عن قيمة دقيقة واحدة، وتقوم بضرب من قبل عدد الدقائق التي تريد إضافة (31 في المثال، على الرغم من أنك وقال 30 في النص).

وأود أيضا أن تبدأ اليوم وتقسيمه إلى وحدات تريد في التعليمات البرمجية. في هذه الحالة، (1/48) تكون 30 دقيقة. أو إذا أردت الخروج عنه من أجل الوضوح، يمكن أن تكتب ((24/01) * (1/2)).

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

نصائح أخرى

وبالإضافة إلى كونها قادرة على إضافة عدد من الأيام إلى تاريخ، يمكنك استخدام أنواع البيانات الفاصلة على افتراض انك على Oracle 9i أو في وقت لاحق، والتي يمكن أن يكون أسهل نوعا ما للقراءة،

SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /

SYSDATE              SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40

http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

والزائفة العمود SYSDATE يظهر تاريخ النظام الحالي والوقت. مضيفا 1 إلى SYSDATE تقديم موعد أقصاه 1 يوم. استخدام الكسور لإضافة الساعات والدقائق أو الثواني للتاريخ

SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;

SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------
03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

أين interval هو واحد من

  • سنة
  • شهر
  • يوم
  • ساعة
  • دقيقة
  • ثانية

أفضّل استخدام interval الحرفي لهذا، لأن interval '30' minute أو interval '5' second أسهل كثيرًا في القراءة بعد ذلك 30 / (24 * 60) أو 5 / (24 * 60 * 69)

على سبيل المثال

  • some_date + interval '2' hour
  • some_date + interval '30' minute
  • some_date + interval '5' second
  • some_date + interval '2' day

يمكنك أيضًا دمج عدة وحدات في تعبير واحد:

  • some_date + interval '2 3:06' day to minute

يضيف يومين و3 ساعات و6 دقائق إلى قيمة التاريخ

ما ورد أعلاه هو أيضًا SQL قياسي ويعمل أيضًا في العديد من أنظمة إدارة قواعد البيانات الأخرى.

مزيد من التفاصيل في الدليل: https://docs.Oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221

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

select field + 0.5/24 from table;

واستنادا إلى المعلومات التي قدمتها، وأعتقد أن هذا هو ما حاولت القيام به، وأنا واثق تماما أنه يعمل.

لا يمكننا استخدام هذا

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

وأنا جديدة في هذا المجال.

ومما لا شك فيه أن أوراكل يدرك أن وقت البدء هو PM، وتحديد قناع شكل HH24 لالناتج النهائي.

SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
  FROM dual

TIME
---------
13:10

ملحوظة: ل'AM' في HH: MI هو مجرد نائب لAM / PM مؤشر الزوال. يمكن 'PM' أيضا

وبناء على ما كنت طالبا، كنت ترغب في HH24: تنسيق MI لTO_CHAR.

لتعديل التاريخ في أوراكل يمكنك محاولة

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

ومثل ذلك بسهولة جدا

وأنا أضيف 10 دقائق إلى تاريخ النظام ودائما في تفضيل استخدام وظائف الخادم ديسيبل لا العرف واحد.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

وببساطة يمكنك استخدام هذا مع تنسيق التاريخ مختلف ....

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