发布日期从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:01
和 2010-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
我创建查询显示期间取消的所有项目
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
将 returnxx
年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:01
和 2010-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