1

我想获取“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'

那么任何人都可以修复查询吗?

4

3 回答 3

7

只需在您的第二次约会中添加一天,并<用于比较;

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

一个用于测试的 SQLfiddle

于 2013-07-29T08:25:32.157 回答
2

而不是使用>and<作为日期范围,您应该使用,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_DATETO_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

于 2013-07-29T08:20:57.337 回答
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) 上放置一个索引。

于 2013-07-29T08:37:54.167 回答