【问题标题】:How Can I format a DATETIME in Oracle Database? [closed]如何在 Oracle 数据库中格式化 DATETIME? [关闭]
【发布时间】:2015-03-24 06:52:48
【问题描述】:

我需要以这种格式在此列中保存日期时间,然后如果我从 GAMES 中写入 select TIME,它将以这种格式显示。但这是错误的。你能帮帮我吗?

create table GAMES  (
      CIS_HRY              INTEGER                     not null,
      NAZEV                VARCHAR2(30)                not null,
      Date DATE NOT NULL   FORMAT 'YYYY-MM-DD',
      TIME DATE NOT NULL   FORMAT 'HH24: MI: SS',
      POPIS                  CLOB,
   constraint PK_GAMES primary key (CIS_HRY)
);

【问题讨论】:

  • 您使用日期等原生格式保存日期/时间值。您可以使用 to_char() 将它们转换为字符串,以获取您在查询中需要的表示形式。
  • 对不起,对我来说可以说更愚蠢吗?当我转换它?每次如果我想选择日期?或者它可以永久转换。
  • 您可以将任何您喜欢的格式存储在字符串中(NVARCHAR),oracle标准类型没有格式,所以每次选择都需要转换。 (您可以在视图中执行此操作,但要小心,如果您想对结果进行过滤或排序,它可能不会使用索引)。
  • 因为您可能需要使用比较运算符,例如 等。将日期和时间存储为字符串是不明智的。作为一个 FYI,Oracle 日期数据类型包括一个时间组件,而不是小数秒,就像时间戳数据类型一样。因此,通过拥有一个日期字段,您可以获得日期和时间信息,基于您发布的内容(SS 已满,而不是小数秒)。正如 gordon 所指出的,当您运行选择时,您可以使用 to_char() 将日期和时间组件分隔为 2 列,以所需的任何格式。

标签: sql database oracle date create-table


【解决方案1】:

日期在 Oracle 中没有“格式” - 它们始终包含字段 YEAR、MONTH、DAY、HOUR、MINUTE 和 SECOND。在提取日期以用于特定情况时,您可以使用 TO_CHAR 函数格式化日期。我建议您将表格设计重新设计为

create table GAMES  (
      CIS_HRY              INTEGER not null,
      NAZEV                VARCHAR2(30) not null,
      CREATED_DATE_TIME    DATE NOT NULL,
      POPIS                CLOB,
   constraint PK_GAMES primary key (CIS_HRY)
);

从该表中获取数据时,您可以使用 TO_CHAR 来格式化日期:

SELECT CIS_HRY,
       NAZEV,
       TO_CHAR(CREATED_DATE_TIME, 'DD-MON-YYYY HH24:MI:SS') AS CREATE_DT,
  FROM GAMES
  WHERE NAZEV = 'XYZ';

分享和享受。

【讨论】:

    【解决方案2】:

    在这种情况下,您可以做几件事。如果您使用的是 Oracle 11g 或 12c,则可以使用虚拟列以 VARCHAR2 格式将日期“存储”为 YYYY-MM-DD,并以您指定的格式存储时间;或者您可以在INSERTUPDATE 上使用触发器对真实列执行相同操作;或者你可以(这可能是最好的选择),创建一个视图:

    CREATE VIEW games_v AS
    SELECT cis_hry, nazev, TO_CHAR(create_dt, 'YYYY-MM-DD') AS chardate
         , TO_CHAR(create_dt, 'HH24: MI: SS') AS chartime, popis
      FROM games;
    

    如果您需要更新GAMES_V 视图中的“日期”和/或“时间”,您可以通过GAMES_V 上的INSTEAD OF 触发器来执行此操作。就您的目的而言,这可能有点矫枉过正。

    顺便说一句,我会避免使用date 作为Oracle 中的列名——它是一个保留字。你也应该避免time - 我不认为它是一个保留字,但它是通用的,不是很具描述性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多