【问题标题】:Create table with date column that has only specific columns使用仅包含特定列的日期列创建表
【发布时间】:2022-01-10 12:46:12
【问题描述】:

我必须创建这个表:

Temps_ED (DateFacture, month, year)

在哪里:

DateFacture :day+month+year
month: (month+year)
year : year

【问题讨论】:

  • 这些列应该是什么数据类型?您使用的是什么RDBMS
  • 我假设的日期?它没有指定,但我认为日期,很容易让他们成为 varchar。我正在使用 Oracle 21C
  • 只制作 varchar 会很容易,这将导致您在未来询问有关如何处理存储为字符串的日期引起的问题的更多问题.
  • 我认为我可以做到这一点,或者至少找到解决方案,为此我搜索并没有发现有帮助,或者我想象的解决方案可能首先不存在
  • 不完全清楚你在问什么,但不要在多列中存储相同的值。将日期存储为日期,如果您需要月份和年份的列,请创建计算的列。

标签: sql oracle date


【解决方案1】:

Oracle 有两种数据类型用于存储日期时间值。

  • DATE
  • TIMESTAMP

总是都有年、月、日、时、分、秒的组成部分。 TIMESTAMP 可以选择有小数秒和/或时间戳。因此,如果您使用 DATETIMESTAMP 数据类型,则必须有一个时间组件。

我要问的是是否有办法制作列类型日期,但只能采用特定格式,如“月份日期'mm/dd'”

不,DATETIMESTAMP 都是二进制数据类型;他们不存储任何格式。如果您想要一种格式,则需要将其从二进制数据转换为格式化数据(即字符串),但这并不意味着您应该将值存储为字符串;您应该将它们存储为二进制数据,然后在检索/显示时对其进行格式化。


一种解决方案是存储DATE,然后使用虚拟列来获取其他格式;这将确保所有列都是一致的。

CREATE TABLE temps_ed (
  value        DATE,
  datefracture VARCHAR2(10)
               GENERATED ALWAYS AS (TO_CHAR(value, 'YYYY-MM-DD')),
  month        VARCHAR2(7)
               GENERATED ALWAYS AS (TO_CHAR(value, 'YYYY-MM')),
  year         NUMBER(4,0)
               GENERATED ALWAYS AS (EXTRACT(YEAR FROM value))
);

INSERT INTO temps_ed (value) VALUES (SYSDATE);

然后:

SELECT * FROM temps_ed;

输出:

VALUE DATEFRACTURE MONTH YEAR
2021-12-04T14:41:37 2021-12-04 2021-12 2021

db小提琴here

【讨论】:

  • 哇这行得通!非常感谢先生!
  • “哇,这会奏效!!非常感谢先生!”这里有一个更大的教训。永远不要专注于一些预先设想的解决方案。您对特定技术的了解越少,这一课就越重要。
  • 嗯,确定吗?谢谢你的智慧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多