【问题标题】:date function with oracle dboracle db的日期函数
【发布时间】:2023-04-03 21:52:01
【问题描述】:

在创建表时,我提到了 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') 

【问题讨论】:

  • 从不将日期存储在 varchar 列中。这是一个可怕的想法。
  • 如果你有一个旧表是一回事,但你绝对不应该创建一个新表来将日期存储为 VARCHAR2
  • 另外,仅供参考,我相信EXTRACT() 函数返回一个数字而不是一个字符。

标签: oracle timestamp to-date


【解决方案1】:

假设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 是一个会话参数,因此每个用户都可以修改它,它可能在用户之间甚至用户会话之间不一致。

【讨论】:

  • 错误代码 1843,SQL 状态 22008:ORA-01843:无效月份
  • 我已尝试过此操作,但出现此错误 - 错误代码 1843,SQL 状态 22008:ORA-01843:无效月份。有没有其他方法可以从数据库中检索日期,我使用 varchar2 类型作为列。
  • @sujithraelumalai 已更新。
  • 先生有没有办法只使用月份和年份来检索数据而不提及日期
  • @sujithraelumalai 更新
【解决方案2】:

当您的日期字符串始终格式化为 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;

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

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2014-03-01
    • 2012-04-05
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-07-16
    相关资源
    最近更新 更多