oracle 中比较日期大小,日期定义的是varchar2类型的,比如'2011-10-21'

上周,一位客户问我有关比较 Oracle 数据库中的日期格式的问题。
他说,他公司的一些日期字段存储为Varchar2 类型,格式固定,他想知道如何比较这些日期字段之间的差异。
我向他解释说,确实不需要通过int类型来比较日期,可以直接使用to_date函数进行转换。

让我举个例子。
例如,如果他的字段日期格式是“yyyy-mm-dd”,那么他可以这样编写SQL语句:to_date('2 01 1 -1 0-2 1 ','yyyy-mm-dd')。
这会将字符串形式的日期转换为日期类型。

如果A字段和B字段都是固定格式的Varchar2 日期值,要比较它们之间的日期差异,可以使用这样的SQL语句: select from table name where to_date(A,'yyyy-mm-dd')
to_date(B,'yyyy-mm-dd') > 1 8 0。
该语句的含义是查找A字段日期比B字段日期晚1 8 0天以上的记录。

他在Oracle环境下测试了这个方法,说确实通过了。
反正你能想到,这个方法还是蛮实用的。
我还在想,如果日期格式不固定怎么办? 不过,我们可以暂时把这个问题放在一边,先解决眼前的问题。

SQL如何判断两个日期的大小

结论:2 01 5 年5 月2 2 日下午5 :1 0:00晚于2 01 5 年5 月2 1 日下午5 :1 0:00,时差为8 6 秒。

oracle中怎么用日期做比较

Oracle 日期比较直接使用运算符。

=判断为数字相同,判断为不同。

> 大于,< 小于,>= 大于或等于,<= 小于或等于。

使用TO_DATE转换字符串,格式必须正确,例如'2 02 3 -06 -01 '转换为DATE类型。

例如: SELECT CASE WHEN sysdate = TO_DATE('2 02 3 -06 -01 ', 'YYYY-MM-DD') THEN 'Equal' ELSE 'Not equal' END AS result;
默认带时间部分,使用 TRUNC (sysdate) 去掉时间,只比较日期。

例如: SELECT CASE WHEN TRUNC(sysdate) = TRUNC(TO_DATE('2 02 3 -06 -01 ', 'YYYY-MM-DD')) THEN 'Equal' ELSE 'Not equal' END AS 结果;
绑定变量使用:前缀,例如:compare_date := '2 02 3 -06 -01 '。

要检查日期范围,请使用 BETWEEN,例如 BETWEEN TO_DATE('2 02 3 -01 -01 ', 'YYYY-MM-DD') AND TO_DATE('2 02 3 -1 2 -3 1 ', 'YYYY-MM-DD')。

NULL值比较的结果为NULL,使用NVL将其转换为默认值,例如NVL(some_date, TO_DATE('1 9 00-01 -01 ', 'YYYY-MM-DD'))。

ADD_MONTHS 加月份,例如 ADD_MONTHS(TO_DATE('2 02 3 -01 -01 ', 'YYYY-MM-DD'), 5 )。

MONTHS_BETWEEN 计算月份差异,例如 MONTHS_BETWEEN(sysdate, TO_DATE('2 02 3 -01 -01 ', 'YYYY-MM-DD'))。

注意,格式必须是硬编码的,不要让Oracle猜到。
该函数会破坏索引,请尝试直接比较。

例如查看最近3 0天内的发货订单: SELECT order_id, order_date FROM Orders WHERE order_date >= ADD_DAYS(TRUNC(sysdate), -3 0) AND status = 'SHIPPED' ORDER BY order_date DESC;
您可以自己掂量一下。