如何根据Oracle SQL中的日期进行过滤

A P*_*mer 1 sql oracle

我在我的函数中有如下查询.在那里我需要根据a.submit_date进行过滤

SELECT mail_id , mail_async, mail_priority FROM glms_mail_sys_mail_store a
WHERE                  
--(TO_DATE(a.submit_date,'dd-MM-yyyy HH:mm') >= '14-06-2012 18:30')
--AND (TO_DATE(a.submit_date,'dd-MM-yyyy HH:mm') <= '15-06-2012 18:50')

(TO_DATE(TO_CHAR(a.submit_date,'dd-MM-yyyy HH:mm'),'dd-MM-yyyy HH:mm') >= '14-06-2012 18:30')
AND (TO_DATE(TO_CHAR(a.submit_date,'dd-MM-yyyy HH:mm'),'dd-MM-yyyy HH:mm') <= '15-06-2012 18:30')
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,a.submit_date的值为'14 -06-2012 20:30'

但它投掷无效的月份...任何人都可以帮助纠正这个?

dcp*_*dcp 9

首先,尝试下面这个,它的工作原理:

SELECT TO_DATE('14-06-2012 20:30','dd-MM-yyyy HH24:MI') FROM dual
Run Code Online (Sandbox Code Playgroud)

然后,您需要将不等式的右侧转换为日期.

a.submit_date >= TO_DATE('14-06-2012 18:30','dd-MM-yyyy HH24:MI') AND
a.submit_date <= TO_DATE('15-06-2012 18:50','dd-MM-yyyy HH24:MI')
Run Code Online (Sandbox Code Playgroud)

如果你想把它写得更清洁,请BETWEEN改用:

a.submit_date BETWEEN
  TO_DATE('14-06-2012 18:30','dd-MM-yyyy HH24:MI') AND
  TO_DATE('15-06-2012 18:50','dd-MM-yyyy HH24:MI')
Run Code Online (Sandbox Code Playgroud)

编辑:

这是一个完整的例子:

CREATE TABLE foo (submit_date DATE);

INSERT INTO foo VALUES (to_date('14-06-2012 20:30','dd-MM-yyyy HH24:MI'));
INSERT INTO foo VALUES (to_date('14-07-2012 20:30','dd-MM-yyyy HH24:MI'));

SELECT * FROM foo a
WHERE
a.submit_date BETWEEN
  TO_DATE('14-06-2012 18:30','dd-MM-yyyy HH24:MI') AND
  TO_DATE('15-06-2012 18:50','dd-MM-yyyy HH24:MI')
Run Code Online (Sandbox Code Playgroud)

输出:

    SUBMIT_DATE
1   6/14/2012 8:30:00 PM
Run Code Online (Sandbox Code Playgroud)