发布日期从xx年1月1日至今

Date of release from 1-jan-xx year until now

我创建查询显示期间取消的所有项目 start.date - end.date

select substr(tarifa,1,2) as tarifa, count(*) as komada
from pol p, uvod u, doppov d
WHERE (datum_dop >='1-jan-07')  AND (datum_dop<='1-jul-13')
and  izdavanje>='01-jul-10'
and p.orgjed = u.sorgz  (+)
and p.polica=d.polica and d.pov_dopl='P'
--and DATUM_PREKIDA is not null
and d.status='F'
and cisti_ao(p.polica)!=0
group by substr(tarifa,1,2)

现在我想编辑这个查询列izdavanje。如果用户输入 '27-sep-xx year' 则需要在 start-date '01-jan-xx' 至 '27-sep-xx year' 期间显示项目 因此,开始日期需要始终为“1-jan-xx 年”,结束日期需要输入日期,例如“19-aug-xx”。 知道如何解决这个问题吗?

这个:

and  izdavanje>='01-jul-10'

会变成

and  izdavanje between to_date('01.01.' || substr(:BLOK.IZDAVANJE, -2), 'dd.mm.rr')
                   and to_date(:BLOK.IZDAVANJE, 'dd-mon-rr')
  • substr 将 return xx
  • to_date 会将整个值转换为有效日期

现在,因为它是表单,您可能需要稍微调整一下(取决于列数据类型以及表单项的数据类型),但是-这是一般的想法。

您可以使用 TO_CHAR() 函数修改查询中的日期:

而不是:

and  izdavanje>='01-jul-10'

使用这个:

and izdavanje between TO_CHAR( :BLOK.IZDAVANJE, 'YYYY-01-01' )
    and TO_CHAR( :BLOK.IZDAVANJE, 'YYYY-MM-DD 23:59:59' )

TO_CHAR( :BLOK.IZDAVANJE, 'YYYY-01-01' ) 仅从日期中提取年份并在其中添加“-01-01”(1 月 1 日)。

TO_CHAR( :BLOK.IZDAVANJE, 'YYYY-MM-DD 23:59:59' ) 将一天中的最大时间添加到日期中,因为 'between xxx and yyy' 表示等于或小于第 yyy 天的 00:00:00 以及时间戳大于 [=25 的所有时间戳=] 但在 :BLOK.IZDAVANJE.

中使用时间值时不会涵盖同一天

您想使用 TRUNC( date_value, 'YY' ) 将其截断到年初:

AND  izdavanje BETWEEN TRUNC( '01-jul-10', 'YY' ) AND '01-jul-10'

但是,您还应该注意 '01-jul-10' 是文本文字,因此,当需要日期时,Oracle 必须执行从文本文字到日期的隐式转换。您最好执行显式转换(因为 Oracle 的默认格式是 NLS_DATE_FORMAT 会话参数,并且 ANY 用户可以在他们自己的会话中更改此值,更改会破坏您的查询无需对您的代码进行任何修改)。

例如,要对日期执行显式转换:

AND izdavanje BETWEEN TRUNC(
                        TO_DATE( '01-jul-10', 'DD-MON-RR', 'NLS_DATE_LANGUAGE = American' ),
                        'YY'
                      )
              AND     TO_DATE( '01-jul-10', 'DD-MON-RR', 'NLS_DATE_LANGUAGE = American' )

此外,如果您的 izdavanje 日期值包含时间部分,则 '01-jul-10' 将转换为午夜 (00:00:00) 的日期,因此您将不会获得返回的任何值时间分量介于 2010-07-01 00:00:012010-07-01 23:59:59 之间的日期。如果这是相关的并且您希望返回这些值,那么您应该使用:

AND izdavanje >= TRUNC(
                   TO_DATE( '01-jul-10', 'DD-MON-RR', 'NLS_DATE_LANGUAGE = American' ),
                   'YY'
                 )
AND izdavanje <  TO_DATE( '01-jul-10', 'DD-MON-RR', 'NLS_DATE_LANGUAGE = American' )
                   + INTERVAL '1' DAY