2010-09-01 27 views
6

Birinin diğerine less than or equal olup olmadığını görmek için Oracle kod çözme işlevini kullanarak iki tarihi karşılaştırmam gerekiyor. DATE1> = eğerKod çözme işlevini kullanarak Oracle'da tarihlerin karşılaştırılması

decode((date1 - date2) - abs(date1 - date2), 0, date2, date1) 

bu DATE2 dönmek olmaz: http://www.techonthenet.com/oracle/functions/decode.php

DATE1> DATE2 eğer aşağıda kod çözme işlevi DATE2 döneceğini (altta) ülkesi -

ben bu yazıyı buldum date2?

Ya da sadece date1> date2 ise mi?

Daha kolay bir çözüm var mı?

cevap

18

Bu işlev DATE2 < = DATE1 eğer DATE2 dönecektir. Değerleri takmak ve sözde kod çevirmek, her iki tarihin aynı olduğu if 0 - 0 = 0 then date2 else date1 olsun.

iyi çözüm, daha sonra 8i kullanırken veya eğer case kullanmaktır: case eşitsizlik operatörleri verir

select case when date1 >= date2 then date2 else date1 end from Your_Table; 

yana, çok daha okunabilir bu.

0

Date2 dönecektir zaman DATE1> = DATE2

1

Sen months_between fonksiyonunu deneyebilirsiniz. Ondalık sayı olarak iki tarih arasındaki ay sayısını hesaplar. Bu elde etmek için ~ 0.48 (2010-09-01 yaklaşık saat 11:30 'da yürütülen) ikinci hat geri 1. dönecektir Bu örnekte

select months_between(sysdate+30, sysdate) from dual; 
select months_between(sysdate+15, sysdate) from dual; 

birinci paramatresi saniyeden daha fazladır gerçek tarih değerlerini: genel olarak

select case when months_between(sysdate+30, sysdate) > 0 then sysdate+30 else sysdate end from dual; 

:

case when months_between(dateA, dateB) > 0 then dateA else dateB 

Güncelleme:

Bazı deneylerden sonra, bu işlevin en iyi tanecikleri Gün'dür. 0.032258064516129 dönecektir 0

ama

select months_between(to_date('2010-10-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 
         to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) 
from dual; 

select months_between(to_date('2010-10-16 23:59:59', 'YYYY-MM-DD HH24:MI:SS'), 
         to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) 
from dual; 

... dönecektir.

diğer bazı ilginç tarih farkı

/burada tekniklerini karşılaştırmak: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns

7

@Allan, bana sizin için en iyi çözümü verdi, ancak decode işlevini kullanmakta ısrar ederseniz, bunun yerine sign işlevinin sonucunu işleyebilirsiniz.

http://www.techonthenet.com/oracle/functions/sign.php

sign(a) döner -1a < 0 eğer 0a = 0 ancak ve 1a > 0 eğer. yani, 1/1 her zaman daha azdır -

select decode(sign(date2-date1), 
       -1 /*this means date 1 > date 2*/, date1 /* return date1*/, 
       0 /*dates are equal */,   date1 /* again, return date1*/, 
       /*in any other case, which is date2 > date1, return date2*/ date2) 
from dual; 
1

tarihe göre kontrol çalışıyorsanız: Böylece, aşağıdaki mantık

if date1 >= date2 then 
    return date1; 
else 
    return date2; 
end if; 

şu şekilde decode kullanılarak yeniden yazılabilir 1/2'dan ve her 1/1'de, Oracle DATE daha büyük olsa bile, her zaman 1'e eşittir - o zaman aşağıdaki gibi karşılaştırmak istediğinizde:

TRUNC (DATE1) < = TRUNC (TRUNC) DATE2)

Diğer cevaplarda bunu göremiyorum, bu kadar basit, soruyu yanlış anladığımı merak ediyorum.

+1

Ben açıkça size DECODE istediğini söyledi şimdi görüyoruz. Bir boole durumunun değerlendirildiği bir soruyu CASE kullanırım. Ne olursa olsun, maksimum hassasiyetle karşılaştırmayı istemediğiniz sürece, tarihleri ​​karşılaştırırken dakikayı kesmeyi unutmayın. – orbfish

+0

Mükemmel bir nokta, ben çok sık tarihlerle çalıştığım için bunu açıkladım ama başkalarının buna bakıp bakmadığını söylemek güzel bir şey. – Freddy

0

Bu daha iyidir:

decode(sign(trunc(sysdate) - (trunc(sysdate))), 1, 1, -1, -1, 0 , 0) 

1: date 1 > date 2 
0: date 1 = date 2 
-1: date 1 < date 2 
+0

Sadece İngilizce lütfen – durron597

İlgili konular