我想获取'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'
那么有人可以修复查询吗?
答案 0 :(得分:7)
只需在第二个日期添加一天,然后使用<
进行比较;
SELECT A.NAME, A.GENDER
FROM A
WHERE A.DTM >= TO_DATE('20130501','YYYYMMDD')
AND A.DTM < TO_DATE('20130501','YYYYMMDD')+1
答案 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)上放一个索引。