【问题标题】:Oracle Sql get only month and year in date datatypeOracle Sql 仅获取日期数据类型中的月份和年份
【发布时间】:2011-07-21 18:53:40
【问题描述】:

我只想以 oracle 数据类型存储月份和年份。

我在名为 time_period 的列中存储了类似“01-FEB-2010”的日期。

为了只得到月份和年份,我写了一个类似的查询

select to_char(time_period,'MON-YYYY') from fact_table;

我将结果设为“FEB-2010”,这很好,但唯一的问题是它是 varchar 数据类型。

所以我喜欢

select to_date(to_char(time_period,'MON-YYYY'),'MON-YYYY') from fact_table

我得到了 2010 年 2 月 1 日。日期数据类型中不能只存储 FEB-2010

【问题讨论】:

  • Oracle 不在字符表示中存储日期(即 '01-FEB-2010' 或 'FEB-2010',这些实际上只是通过 GUI 显示日期的一种方式),它的存储为简单的字节数据。你有什么问题。 NLS_DATE_FORMAT定义的默认格式

标签: oracle11g


【解决方案1】:

最简单的解决方案是使用正确的数据类型创建列:DATE

例如:

  1. 创建表:

    创建表test_date(我的日期日期);

  2. 插入行:

    插入 test_date 值 (to_date('01-01-2011','dd-mm-yyyy'));

要获取月份和年份,请执行以下操作:

select to_char(mydate, 'MM-YYYY') from test_date;

您的结果将如下所示:01-2011

另一个很酷的功能是“提取”

select extract(year from mydate) from test_date;

这将返回:2011

【讨论】:

    【解决方案2】:

    “FEB-2010”不是日期,因此将其存储在日期列中没有多大意义。

    您始终可以使用上面显示的 TO_CHAR 逻辑提取所需的字符串部分,在您的情况下为“MON-YYYY”。

    如果这是针对数据仓库环境中的 DIMENSION 表,并且您希望将这些作为单独的列包含在 Dimension 表中(作为数据属性),则需要将月份和年份存储在两个不同的列中,并使用适当的数据类型...

    例子..

    Month varchar2(3) --Month code in Alpha..
    Year  NUMBER      -- Year in number
    
    or
    
    Month number(2)    --Month Number in Year.
    Year  NUMBER      -- Year in number
    

    【讨论】:

      【解决方案3】:
      SELECT to_char(to_date(month,'yyyy-mm'),'Mon yyyy'), nos
      FROM (SELECT to_char(credit_date,'yyyy-mm') MONTH,count(*) nos
            FROM HCN
            WHERE   TRUNC(CREDIT_dATE) BEtween '01-jul-2014' AND '30-JUN-2015'
            AND CATEGORYCODECFR=22
            --AND CREDIT_NOTE_NO IS NOT  NULL
            AND CANCELDATE IS NULL
      GROUP BY to_char(credit_date,'yyyy-mm')
      ORDER BY to_char(credit_date,'yyyy-mm') ) mm
      

      输出:

      Jul 2014        49
      Aug 2014        35
      Sep 2014        57
      Oct 2014        50
      Nov 2014        45
      Dec 2014        88
      Jan 2015       131
      Feb 2015       112
      Mar 2015        76
      Apr 2015        45
      May 2015        49
      Jun 2015        40
      

      【讨论】:

        【解决方案4】:

        为此推荐的解决方案是将字段/列定义为 DATE 或 DATETIME 数据类型。 这是一个正确的日期格式值,从日期中提取月-年很容易,有以下两种方法。

        1. 从 DUAL 中选择 TO_CHAR(CREATE_DATE,'MON YYYY'); 这将返回日期为“JAN 2022”。如果需要,我们也可以更改格式。
        2. 也可以使用“EXTRACT”关键字,但问题是我们必须使用两次才能获得上述格式,因为 EXTRACT 一次会返回一个值。因此,首先检索 MONTH,然后是 YEAR(反之亦然)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          • 1970-01-01
          • 2021-12-16
          • 2016-04-14
          • 1970-01-01
          相关资源
          最近更新 更多