使用oracle db的日期函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用oracle db的日期函数相关的知识,希望对你有一定的参考价值。

在创建表时我已经提到varchar2类型来存储日期,现在我不确定oracle查询来检索“从 - 到 - 日期”。

直到现在我已经尝试过这个查询

SELECT DSC_REF,EMP_NO, EMP_NAME, ACTION_DATE from DSC_UPLOAD 
WHERE ACTION_DATE Between (extract(month from to_date(ACTION_DATE,'dd/mm/yyyy')) = '02' 
                          (extract(month from to_date(ACTION_DATE,'dd/mm/yyyy')) = '03' 
AND extract(year from to_date(ACTION_DATE,'dd/mm/yyyy'))='2018') 
答案

假设ACTION_DATEDATE数据类型,那么一个简单的方法就是使用DATE文字:

SELECT DSC_REF,
       EMP_NO,
       EMP_NAME,
       ACTION_DATE
from   DSC_UPLOAD 
WHERE  ACTION_DATE >= DATE '2018-02-01'
AND    ACTION_DATE <  DATE '2018-04-01'

如果它是一个字符串(为什么?)那么:

SELECT DSC_REF,
       EMP_NO,
       EMP_NAME,
       ACTION_DATE
from   DSC_UPLOAD 
WHERE  TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) >= DATE '2018-02-01'
AND    TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) <  DATE '2018-04-01'

有没有办法只使用月份和年份检索数据而不提及日期

你可以做:

WHERE  EXTRACT( MONTH FROM TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) ) IN ( 2, 3 )
AND    EXTRACT( YEAR  FROM TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) ) = 2018

关于您的查询,如果ACTION_DATEDATE数据类型,那么:

to_date(ACTION_DATE,'dd/mm/yyyy')

是个坏主意。 TO_DATE( date_string [, format_string [, nls_string] ] )有一个签名,需要1到3个字符串参数。 Oracle将尝试提供帮助,并使用NLS_DATE_FORMAT会话参数作为格式模型将您的日期隐式转换为字符串,并最终得到一个有效的查询:

TO_DATE(
  TO_CHAR(
    ACTION_DATE,
    (
      SELECT VALUE
      FROM   NLS_SESSION_PARAMETERS
      WHERE  PARAMETER = 'NLS_DATE_FORMAT'
    )
  ),
  'dd/mm/yyyy'
)

如果NLS_DATE_FORMATdd/mm/yyyy不匹配,那么你会得到一个例外 - 而NLS_DATE_FORMAT是一个会话参数,所以每个用户都可以修改它,它可能在用户甚至用户会话之间不一致。

另一答案

当您的日期字符串始终格式化为dd / mm / yyyy时,获得月份和年份的一种方法是:

 month = to_char(to_date(action_date,'dd/mm/yyyy'),'mm')
 year  = to_char(to_date(action_date,'dd/mm/yyyy'),'yyyy')

两者之间的语法是:

expression BETWEEN value1 AND value2;

在给出示例查询后,不确定您的选择是什么。

以上是关于使用oracle db的日期函数的主要内容,如果未能解决你的问题,请参考以下文章

将 JDateChooser 中的日期插入 Oracle DB

将 DB2 日期计算转换为 Oracle 语法

第八课 使用数据处理函数

DB2日期格式更改的方法

Oracle的overlaps函数转换其他数据库语法

如何为 DB2 表值函数传递日期参数