发布日期从 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&gt;='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日期范围选择,颗粒度为`年-月`,支持`至今`选项

我无法与合并命令一起插入表

如何在没有时区的情况下解析 ISO8061 至今

Sketch | 2010年至今,原厂内饰手绘图398张(上)

JavaScript date日期