HH24 uchun raqam: MM konvertatsiyasi - SQL, Oracle

Bizda soat va daqiqalarni anglatuvchi 810 1015 raqamli juftliklar mavjud. Juftlikning daqiqali farqini hisoblashimiz kerak. Yuqoridagi misol 125 (daqiqa) ni beradi.

Siz qanday qarorga kelishingiz mumkin? Men stringni va pastki satrlarni konvertatsiya qilishni o'ylab qoldim, lekin u 3 yoki 4 ning uzunligini bilmayman va ELSE dan foydalansam-u, lekin juda murakkab (agar bu boshqa echim bo'lmasa, men bu bilan qoldirilganman). Bundan tashqari, 60-gachasi bazaga aylantirilganda va undan chiqarib tashlash haqida o'ylardi, lekin juda murakkab.

Oldindan rahmat.

0
3 ta raqam minimal uzunlikmi yoki 85 soat 8:05 da bo'lishi mumkin? Chunki ikkinchi holatda sizda muammo yuzaga keladi, chunki 125 va 1:25 va 12:05 da turishi mumkin
qo'shib qo'ydi muallif Stefano Zanini, manba
lpad ni faqat 4 deyish uchun nolga teng emasmi? Va keyin nima qilmoqchi bo'lsangiz, uni bajaring.
qo'shib qo'ydi muallif Plirkee, manba
lpad ni faqat 4 deyish uchun nolga teng emasmi? Va keyin nima qilmoqchi bo'lsangiz, uni bajaring.
qo'shib qo'ydi muallif Plirkee, manba
lpad ni faqat 4 deyish uchun nolga teng emasmi? Va keyin nima qilmoqchi bo'lsangiz, uni bajaring.
qo'shib qo'ydi muallif Plirkee, manba
Savol, agar 3 ta raqam minimal uzunlik bo'lsa, lekin oxirgi ikki raqam har doim daqiqani ifodalaydi. Shunday qilib, 105, ya'ni 10:05 yoki 1:05 bormi? Tahrirlash va siz 00:20 raqamini qanday namoyon etasiz?
qo'shib qo'ydi muallif Goran Stefanović, manba
Savol, agar 3 ta raqam minimal uzunlik bo'lsa, lekin oxirgi ikki raqam har doim daqiqani ifodalaydi. Shunday qilib, 105, ya'ni 10:05 yoki 1:05 bormi? Tahrirlash va siz 00:20 raqamini qanday namoyon etasiz?
qo'shib qo'ydi muallif Goran Stefanović, manba
Savol, agar 3 ta raqam minimal uzunlik bo'lsa, lekin oxirgi ikki raqam har doim daqiqani ifodalaydi. Shunday qilib, 105, ya'ni 10:05 yoki 1:05 bormi? Tahrirlash va siz 00:20 raqamini qanday namoyon etasiz?
qo'shib qo'ydi muallif Goran Stefanović, manba
125 daqiqa. Bu konversion va olib tashlash natijasi bo'lishi mumkin. Oxirgi ikki raqam doimo daqiqani ifodalaydi. Rahmatli bolalar.
qo'shib qo'ydi muallif Najib Ghadri, manba
125 daqiqa. Bu konversion va olib tashlash natijasi bo'lishi mumkin. Oxirgi ikki raqam doimo daqiqani ifodalaydi. Rahmatli bolalar.
qo'shib qo'ydi muallif Najib Ghadri, manba
125 daqiqa. Bu konversion va olib tashlash natijasi bo'lishi mumkin. Oxirgi ikki raqam doimo daqiqani ifodalaydi. Rahmatli bolalar.
qo'shib qo'ydi muallif Najib Ghadri, manba

7 javoblar

Tartibga solish: Bu yechim Plirkee ning 4-belgilar satrlarini olish uchun lpad-raqamlariga izohini va Stefano Zanini-ning 0-va 24-soatlik formatini o'zgartirish uchun o'zgartirgan qaroriga asoslanadi.

Agar oxirgi ikki raqam doimo daqiqani ifodalasa va soat har doim 24 soatlik formatda bo'lsa:

with t(time1, time2) as (
  select 810, 1015 from dual union all
  select 20, 1530 from dual
),
conv(time1, time2) as (
  select lpad(to_char(time1), 4, '0'),
         lpad(to_char(time2), 4, '0')
    from t
)
select time1,
       time2,
       24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes
  from conv;
2
qo'shib qo'ydi
Rahmat! lpad yo'qolgan parcha edi.
qo'shib qo'ydi muallif Najib Ghadri, manba

Tartibga solish: Bu yechim Plirkee ning 4-belgilar satrlarini olish uchun lpad-raqamlariga izohini va Stefano Zanini-ning 0-va 24-soatlik formatini o'zgartirish uchun o'zgartirgan qaroriga asoslanadi.

Agar oxirgi ikki raqam doimo daqiqani ifodalasa va soat har doim 24 soatlik formatda bo'lsa:

with t(time1, time2) as (
  select 810, 1015 from dual union all
  select 20, 1530 from dual
),
conv(time1, time2) as (
  select lpad(to_char(time1), 4, '0'),
         lpad(to_char(time2), 4, '0')
    from t
)
select time1,
       time2,
       24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes
  from conv;
2
qo'shib qo'ydi
Rahmat! lpad yo'qolgan parcha edi.
qo'shib qo'ydi muallif Najib Ghadri, manba

01-10-2000 kabi standart sana qismini ishlatib, ma'lumotni DATA datetype sifatida saqlash haqida. Shunday qilib siz ma'lumot olasiz

    01-01-2000 8:10:00
    01-01-2000 10:15:00
etc

Keyin oddiy matematik matematik qilishingiz mumkin :)

1
qo'shib qo'ydi
Salom! Biz ma'lumotlar bazasini tayyorlaymiz, yozuvlar bilan to'la, shuning uchun vazifa uni o'zgartirishi va uni bugungi kunga aylantirish kerak (uni tasavvur qilganingiz kabi).
qo'shib qo'ydi muallif Najib Ghadri, manba

Faqatgina ishlatilishi mumkin bo'lgan yana bir tweak. Umid qilamanki bu yordam.

SELECT 
TO_CHAR(TO_DATE(LPAD(LPAD('1015',4,'0') - LPAD('810',4,'0'),4,'0'),'HH24MI'),'HH24')*60
+TO_CHAR(TO_DATE(lpad(lpad('1015',4,'0') - lpad('810',4,'0'),4,'0'),'HH24MI'),'MI') MINUTES
FROM dual;
0
qo'shib qo'ydi

Uch raqamni nazarda tutadigan bo'lsak, raqamlaringizning minimal uzunligi (aks holda siz noaniq holatlarga ega bo'lasiz), bu quyidagi so'rovlarni bajarishi kerak:

select  (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
        to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from    (select 810 t1, 1015 t2 from dual)

Ushbu qadamlar:

  1. raqamlarni har ikkala qismda portlashi mumkin: oxirgi ikki raqam daqiqa va qolgan raqamlar sifatida
  2. ikkita qismni ajratuvchi bilan birlashtirish (bu misolda ':')
  3. bu birikmalarni tarixga aylantiradi
  4. ikki sanani (kunduz kunlari) 24 soatga, soatiga 60 daqiqa farqni ko'paytirish uchun
0
qo'shib qo'ydi

Uch raqamni nazarda tutadigan bo'lsak, raqamlaringizning minimal uzunligi (aks holda siz noaniq holatlarga ega bo'lasiz), bu quyidagi so'rovlarni bajarishi kerak:

select  (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
        to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from    (select 810 t1, 1015 t2 from dual)

Ushbu qadamlar:

  1. raqamlarni har ikkala qismda portlashi mumkin: oxirgi ikki raqam daqiqa va qolgan raqamlar sifatida
  2. ikkita qismni ajratuvchi bilan birlashtirish (bu misolda ':')
  3. bu birikmalarni tarixga aylantiradi
  4. ikki sanani (kunduz kunlari) 24 soatga, soatiga 60 daqiqa farqni ko'paytirish uchun
0
qo'shib qo'ydi

Uch raqamni nazarda tutadigan bo'lsak, raqamlaringizning minimal uzunligi (aks holda siz noaniq holatlarga ega bo'lasiz), bu quyidagi so'rovlarni bajarishi kerak:

select  (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
        to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from    (select 810 t1, 1015 t2 from dual)

Ushbu qadamlar:

  1. raqamlarni har ikkala qismda portlashi mumkin: oxirgi ikki raqam daqiqa va qolgan raqamlar sifatida
  2. ikkita qismni ajratuvchi bilan birlashtirish (bu misolda ':')
  3. bu birikmalarni tarixga aylantiradi
  4. ikki sanani (kunduz kunlari) 24 soatga, soatiga 60 daqiqa farqni ko'paytirish uchun
0
qo'shib qo'ydi