使用解码函数比较 Oracle 中的日期
我需要使用 Oracle 解码函数比较两个日期,看看其中一个日期是否小于或等于另一个日期。
我发现这篇文章 - http://www.techonthenet.com/oracle/functions/decode .php
其中指出(在底部)如果 date1 > 则下面的解码函数将返回 date2 date2 :
decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)
如果 date1 >= date2 ,这不会返回 date2 吗?
或者只是如果 date1 >日期2?
有更简单的解决方案吗?
I need to compare two dates using the Oracle decode function to see if one is less than or equal
to the other.
I found this article - http://www.techonthenet.com/oracle/functions/decode.php
Which states (at the bottom) that the below decode function will return date2 if date1 > date2 :
decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)
Would this not return date2 if date1 >= date2 ?
Or is it just if date1 > date2?
Is there an easier solution?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果 date2 <= date1,该函数将返回 date2。代入这些值并转换为伪代码,您将得到
if 0 - 0 = 0 then date2 else date1
,其中两个日期相同。如果您使用 8i 或更高版本,更好的解决方案是使用
case
:由于
case
允许使用不等运算符,因此它的可读性要高得多。或者,如果您想更简洁,可以使用旨在返回 n 值中较小者的函数:(
还有一个 GREATEST 函数,其作用相反。)
That function will return date2 if date2 <= date1. Plugging in the values and translating to pseudo-code, you get
if 0 - 0 = 0 then date2 else date1
where both dates are the same.A better solution, if you're using 8i or later is to use
case
:Since
case
allows inequality operators, it's much more readable.Or, if you want to be more succinct, you could use the function that's designed to return the lower of n values:
(There is also a
GREATEST
function, which does the opposite.)@Allan 已经给了你最好的解决方案,但如果你坚持使用
decode
函数,你可以处理sign
函数的结果。http://www.techonthenet.com/oracle/functions/sign.php
如果
a
sign(a)
返回-1
,则a
如果
a = 0
,则为0
、0
;如果a > 则为
1
。 0 。 以下逻辑:因此,可以使用
decode
按以下方式重写@Allan has already given you the best solution to me, but if you insist on using
decode
function, you can process the result ofsign
function instead.http://www.techonthenet.com/oracle/functions/sign.php
sign(a)
returns-1
ifa < 0
,0
ifa = 0
and1
ifa > 0
. Thus, the following logiccould be rewritten using
decode
in the following way:您可以尝试
months_ Between
函数。它将计算两个日期之间的月数(十进制数)。在此示例中,第一个参数大于第二个参数,因此它将返回 1。第二行返回 ~0.48(在 2010 年 9 月 1 日上午 11:30 左右执行时) 要获取实际日期值:
一般情况下:
更新:
经过一些实验,该函数的最细粒度似乎是“Day”。
...将返回 0
但
将返回 0.032258064516129。
这里还有一些其他有趣的日期差异/比较技术: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_ Between_two_date_columns< /a>
You could try the
months_between
function. It will calculate the number of months between two dates, as a decimal number.In this example, the first paramater is greater than the second so it will return 1. The second line returns ~0.48 (when executed at about 11:30 AM on 2010-09-01) To get the actual date values:
In general:
Update:
After some experimentation, it seems the finest granularity of this function is Day.
...will return 0
but
will return 0.032258064516129.
Some other interesting date difference/compare techniques here: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns
如果您尝试按日期检查 - 也就是说,1/1 中的每个时间都小于 1/2,并且 1/1 上的每个时间都等于 1/1 上的每个其他时间,即使 Oracle DATE 更大- 那么你想进行如下比较:
TRUNC(DATE1) <= TRUNC(DATE2)
我在其他答案中没有看到这一点,它是如此基本,让我想知道我是否误解了这个问题。
If you're trying to check by date - that is, every time in 1/1 is less than 1/2, and every on 1/1 is equal to every other time on 1/1, even if the Oracle DATE is greater - then you want to compare as follows:
TRUNC(DATE1) <= TRUNC(DATE2)
I don't see this in the other answers, it is so basic it makes me wonder if I'm misunderstanding the question.
这是更好的:
This is better:
当 date1 >= date2 时返回 date2
will return date2 when date1 >= date2