where子句中的Oracle日期比较

时间:2017-04-19 17:54:32

标签: oracle date

例如,我有一个带有DOJ(加入日期)列的学生表,其类型设置为DATE,因为我已经以dd-mon-yy格式存储了记录。

我在运行时有一个IN参数,日期作为字符串传递,其格式为dd / mm / yyyy。如何在日期比较和获取结果?

我想获取每个数据库表学生的DOJ为25-AUG-92的学生的记录数,但我在IN参数中以dd / mm / yyyy格式获取varchar日期,请指导。

我尝试了多种选项,例如truncto_dateto_char,但遗憾的是,似乎没有任何效果。

3 个答案:

答案 0 :(得分:4)

  

我有一个带有DOJ(加入日期)列的学生表,其类型设置为DATE,因为我已经以dd-mon-yy格式存储了记录。

不完全是,DATE数据类型没有格式;它作为7-bytes存储在表内部(年份为2个字节,月份,日期,小时,分钟和秒均为1个字节)。您正在使用的用户界面(即SQL / PLUS,SQL Developer,Toad等)将处理DATE从其二进制格式到人类可读格式的格式。在SQL / Plus(或SQL Developer)中,此格式基于NLS_DATE_FORMAT session parameter

如果仅使用日,月和年输入DATE,则时间组件(可能)将设置为00:00:00(午夜)。

  

我在运行时有一个IN参数,日期作为字符串传递,或者说varchar及其格式为dd/mm/yyyy。如何比较和获取日期结果。?

假设您的时间组件DOJ列始终是午夜,那么:

SELECT COUNT(*)
FROM   students
WHERE  doj = TO_DATE( your_param, 'dd/mm/yyyy' )

如果不是午夜,那么:

SELECT COUNT(*)
FROM   students
WHERE  TRUNC( doj ) = TO_DATE( your_param, 'dd/mm/yyyy' )

或:

SELECT COUNT(*)
FROM   students
WHERE  doj >= TO_DATE( your_param, 'dd/mm/yyyy' )
AND    doj <  TO_DATE( your_param, 'dd/mm/yyyy' ) + INTERVAL '1' DAY

答案 1 :(得分:0)

以下应该执行您所描述的内容。如果没有,请提供更多信息,了解&#34;似乎无法正常工作&#34;。

-- Get the count of students with DOJ = 25-AUG-1992
SELECT COUNT(1)
FROM STUDENT
WHERE TRUNC(DOJ) = TO_DATE('25/AUG/1992','dd/mon/yyyy');

上述内容来自this answer。您可能希望查看答案,因为如果性能对您至关重要,则可以使用不同的方式编写此查询但不使用trunc,这将允许Oracle在DOJ上使用索引,如果一个人在场。

答案 2 :(得分:0)

虽然我发布这篇文章的时间有点迟,但我能解决这个问题。

我所做的是我用相似的格式转换了两个日期to_char,这里的工作是我的查询条件有效..

"-[$£-809]* #,##0.00_-;-[$£-809]* #,##0.00_-;_-[$£-809]* "" - ""??_-;_-@_-"

感谢所有人的支持。 :)