我正在尝试创建一个查询,可以在表中获取一些记录,这些记录介于from和date之间,日期仅以月/年为单位。我遇到的问题是当来自和到达日期是同一个月/年时,试图获取记录。
以下是我遇到的问题的一个示例:
select start_date
from job
where trunc(start_date) between to_date('05-2016','mm-yyyy') and to_date('05-2016','mm-yyyy')
在作业表中,5月份有一些start_date记录,但是为了查看它们,我需要将日期设置为“06-2016'”。有没有办法通过指定from和to日期是05-2016来获取5月份的start_date的所有记录?
答案 0 :(得分:0)
在您的示例中,您将在2016年5月1日至2016年5月1日之间选择所有start_date
。
您似乎想在一个月内捕获所有内容,但是您没有指定要截断的格式。没有指定'月'在Trunc()
你截断当天。当您截断到月份时,您现在可以将其设置为等于to_date()
而不是:{/ p>
select start_date
from job
where trunc(start_date,'Month') = to_date('05-2016','mm-yyyy')
Trunc上的Here is some information(日期,[fmt])。当fmt参数留空时,Trunc()默认为' round'到最近的一天,但还有很多其他的选择。
如果你想指定大于一个月的范围你可以在两者之间使用(但请注意,这是从第一个to_date()
的第一天到第二天的第一天' to_date()& #39;:
select start_date
from job
where trunc(start_date)
between to_date('06-2016','mm-yyyy')
and to_date('09-2016','mm-yyyy')
在此示例中,所有Start_dates将填充在2016年6月1日到2016年9月1日之间。
我认为最准确的方法是:
select start_date
from job
where trunc(start_date)
between to_date('06-01-2016','mm-dd-yyyy')
and to_date('09-30-2016','mm-dd-yyyy')
答案 1 :(得分:0)
怎么样?
select start_date
from job
where trunc(start_date, 'mm') between
to_date('05-2016', 'mm-yyyy')
and to_date('05-2016', 'mm-yyyy')
Oracle无法将between
右端的日期插入月末。当to_date()
缺少格式的日期值时,它只会将第1个作为默认值。不确定这是否是您预期的行为。
如果您按月(而不是按天)截断日期,则比较将仅涉及该月的第一天的日期。随着日期折叠,您可以将两个相同值的开头和结尾视为包含范围。据推测,您可以使用某种形式的参数替换硬编码日期,这也适用于更广泛的范围。当然,如果您在一个月内总是查询,between
可能只是一个平等测试。并且这不会在您的列上使用索引,因此它不一定是效率最高的。
我认为这是你正在寻找的东西。您是否有理由提供该格式的日期值?也许有一个更好的方法来使用一点日期数学来解决这个问题。
答案 2 :(得分:0)
试试这样:
select start_date
from job
where trunc(start_date) between to_date('05-2016','mm-yyyy')
and dateadd('d', -1, dateadd('m', 1, to_date('05-2016','mm-yyyy')))
为了查看整个月份的日期,between
子句中的日期范围必须为整整一个月。