为什么我不能比较日期?
Why I can't compare dates?
我有这个简单的查询:
select sm.id, h.time
from main_data sm
INNER JOIN TA t on t.id = sm.id AND t.first=1
LEFT OUTER JOIN History h on h.id= sm.id
WHERE trunc(TO_DATE(h.time, 'DD-MM-YYYY')) BETWEEN trunc(TO_DATE('07.05.2015', 'DD.MM.YYYY')) AND trunc(TO_DATE('07.06.2015', 'DD.MM.YYYY'));
h.time
看起来像 07-MAY-15
以上查询 returns 没有结果,即使指定参数之间有日期。 但是 如果我将 where 子句更改为
WHERE trunc(TO_DATE(h.time, 'DD-MM-YYYY')) BETWEEN trunc(TO_DATE('07.05.15', 'DD-MM-YYYY')) AND trunc(TO_DATE('07.06.15', 'DD-MM-YYYY'))
- 相同的日期但不是 2015
只有 15
我可以看到查询的结果。
问题是我希望用户输入整年 - 而不仅仅是 15
。我怎样才能避免这种不匹配?
首先,你的日期比较太复杂了。如果 h.time
是内部日期格式(应该是),那么只需执行:
WHERE h.time BETWEEN DATE '2015-05-07' AND DATE '2015-06-07'
您的查询的另一个非常重要的问题是 WHERE
子句将 LEFT JOIN
转换为 INNER JOIN
。要么更改联接类型以与逻辑一致,要么将 WHERE
移动到 ON
子句(即使没有匹配的日期,您也会得到结果。
我有这个简单的查询:
select sm.id, h.time
from main_data sm
INNER JOIN TA t on t.id = sm.id AND t.first=1
LEFT OUTER JOIN History h on h.id= sm.id
WHERE trunc(TO_DATE(h.time, 'DD-MM-YYYY')) BETWEEN trunc(TO_DATE('07.05.2015', 'DD.MM.YYYY')) AND trunc(TO_DATE('07.06.2015', 'DD.MM.YYYY'));
h.time
看起来像 07-MAY-15
以上查询 returns 没有结果,即使指定参数之间有日期。 但是 如果我将 where 子句更改为
WHERE trunc(TO_DATE(h.time, 'DD-MM-YYYY')) BETWEEN trunc(TO_DATE('07.05.15', 'DD-MM-YYYY')) AND trunc(TO_DATE('07.06.15', 'DD-MM-YYYY'))
- 相同的日期但不是 2015
只有 15
我可以看到查询的结果。
问题是我希望用户输入整年 - 而不仅仅是 15
。我怎样才能避免这种不匹配?
首先,你的日期比较太复杂了。如果 h.time
是内部日期格式(应该是),那么只需执行:
WHERE h.time BETWEEN DATE '2015-05-07' AND DATE '2015-06-07'
您的查询的另一个非常重要的问题是 WHERE
子句将 LEFT JOIN
转换为 INNER JOIN
。要么更改联接类型以与逻辑一致,要么将 WHERE
移动到 ON
子句(即使没有匹配的日期,您也会得到结果。