发布日期从 1-jan-xx 年至今
Posted
技术标签:
【中文标题】发布日期从 1-jan-xx 年至今【英文标题】:Date of release from 1-jan-xx year until now 【发布时间】:2019-08-19 09:27:25 【问题描述】:我创建了显示所有在期间取消的项目的查询
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”。
知道如何解决这个问题吗?
【问题讨论】:
【参考方案1】:这个:
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
将返回 xx
年份
to_date
会将整个值转换为有效日期
现在,由于它是表单,您可能需要稍微调整一下(取决于列数据类型以及表单项的数据类型),但是 - 这是一般的想法。
【讨论】:
当我将此查询传输到 Oracle Form Builder 时,请查看第一个查询的一般解决方案 我不确定我应该看什么。我告诉过你该怎么做;你为什么不修改and izdavanje>='01-jul-13'
?
@谢谢。我明白了 :) 这是旧查询,这就是它现在被修改的原因 :)【参考方案2】:
您想使用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
),因此您将不会获得返回的任何值的时间分量介于 @987654329 之间的日期@ 和 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
【讨论】:
【参考方案3】:您可以使用 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' )
将一天中的最大时间添加到日期,因为“在 xxx 和 yyy 之间”表示等于或小于 yyy 天的 00:00:00 以及所有时间戳大于 00:00:00 但在 :BLOK.IZDAVANJE 中使用时间值时不会覆盖同一天。
【讨论】:
DATE_FORMAT
是 Oracle Business Intelligence function,在标准 SQL 中不可用。 DATE_FORMAT
也是 mysql function,但是 OP 已将该问题标记为 Oracle。
对不起,你是对的 MT0。我忘记了上面的标签。我修改了我的答案,以便使用 TO_CHAR() 而不是 DATE_FORMAT()。以上是关于发布日期从 1-jan-xx 年至今的主要内容,如果未能解决你的问题,请参考以下文章
uni-app日期范围选择,颗粒度为`年-月`,支持`至今`选项
uni-app日期范围选择,颗粒度为`年-月`,支持`至今`选项