例如,我有一个带有DOJ(加入日期)列的学生表,其类型设置为DATE,因为我已经以dd-mon-yy格式存储了记录。
我在运行时有一个IN参数,日期作为字符串传递,其格式为dd / mm / yyyy。如何在日期比较和获取结果?
我想获取每个数据库表学生的DOJ为25-AUG-92的学生的记录数,但我在IN参数中以dd / mm / yyyy格式获取varchar日期,请指导。
我尝试了多种选项,例如trunc
,to_date
,to_char
,但遗憾的是,似乎没有任何效果。
答案 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]* "" - ""??_-;_-@_-"
感谢所有人的支持。 :)