选择两个日期之间的数据

时间:2013-07-29 08:16:16

标签: sql oracle date

我想获取'20130501'的数据

以下是我将'20130501'作为开始日期,'20130502'作为结束日期的查询。

SELECT A.NAME, A.GENDER
                FROM TABLE A
              WHERE 
               A.DTM >= TO_DATE('20130501','YYYYMMDD')
              AND A.DTM <= TO_DATE('20130502','YYYYMMDD')

上面的查询给出了'20130501'的数据。 但现在我想为开始和结束日期输入数据输入'20130501'。以下是查询

SELECT A.NAME, A.GENDER
                FROM TABLE A
              WHERE 
               A.DTM >= TO_DATE('20130501','YYYYMMDD')
              AND A.DTM <= TO_DATE('20130501','YYYYMMDD')

当我运行查询时,我没有数据。我认为这是因为DB将'20130501'都读为 同一时间。但我希望它是'20130501 00:00'到'20130501 24:00'

那么有人可以修复查询吗?

3 个答案:

答案 0 :(得分:7)

只需在第二个日期添加一天,然后使用<进行比较;

SELECT A.NAME, A.GENDER
FROM A
WHERE A.DTM >= TO_DATE('20130501','YYYYMMDD')
  AND A.DTM <  TO_DATE('20130501','YYYYMMDD')+1

An SQLfiddle to test with

答案 1 :(得分:2)

除了使用><作为日期范围,您应该使用BETWEEN,因为它包含范围:

SELECT A.NAME, A.GENDER
FROM TABLE A
WHERE A.DTM BETWEEN TO_DATE('20130501','YYYYMMDD') AND TO_DATE('20130502','YYYYMMDD');

http://www.techonthenet.com/sql/between.php

由于TO_DATE的解决方案不支持毫秒,您可以将TO_DATE转换为支持毫秒的TO_TIMESTAMP

SELECT A.NAME, A.GENDER
    FROM TABLE A
    WHERE A.DTM BETWEEN TO_DATE('20130501'||' 00:00','YYYYMMDD HH24:MI') AND TO_TIMESTAMP('20130501'||' 23:59:59.999','YYYYMMDD HH24:MI:SS.FF');

但是如果你需要更高的精度,你应该使用日期差异:

SELECT A.NAME, A.GENDER
FROM TABLE A
WHERE (A.DTM - TRUNC(TO_DATE('20130501','YYYYMMDD')) BETWEEN 0 AND 1;

0 = A.DTM等于20130501 00:00

1 = A.DTM等于20130502

答案 2 :(得分:0)

解决问题的另一种方法是截断与之比较的日期:

SELECT A.NAME, A.GENDER
FROM TABLE A
WHERE TRUNC(A.DTM) BETWEEN TO_DATE('20130501','YYYYMMDD') AND TO_DATE('20130501','YYYYMMDD');

编辑:如果您只想要一天:

SELECT A.NAME, A.GENDER 
FROM TABLE A
WHERE TRUNC(A.DTM) = TO_DATE('20130501','YYYYMMDD');

关于性能的编辑:根据我的经验,TRUNC相当快,如果没有索引则不会产生明显的差异。话虽如此:TRUNC(A.DTM)不会在A.DTM上使用指数。你可以在TRUNC(A.DTM)上放一个索引。