java Oracle数据库:使用字符(X)或数字(X)代替日期
我发现Oracle数据库中的date
类型存在一些问题。我必须管理大量的数据,而它们在索引和其他方面的工作似乎不如预期。重要的是,我已经决定使用另一种类型
我的选择是:
numeric(8)
表示“日期”,而numeric(6)
表示“时间”char(8)
表示“日期”,而char(6)
表示“时间”
字段的格式为YYYYMMAA
表示日期,而HHMMSS
表示时间
优先顺序(考虑)为:
- 单独查询字段的性能(x3.5)
- 查询合并为一个字段的性能(日期+时间)(x3)
- java可用性(x2)
- 数据库的易读性(x1)
您建议使用哪种类型?为什么
谢谢!:)
# 1 楼答案
我建议仍然使用日期类型。它将以数字形式存储;)。但是如果你想将其存储为数字或字符,那么20151019作为数字就更有意义了:)(同样从大小和性能角度来看)顺便说一句,日期格式会更小
# 2 楼答案
ISO 8601
如果必须将日期时间值序列化为字符串,请使用标准ISO 8601格式。以下是几种格式的示例:
这整个标准出人意料地经过深思熟虑和实用。字符串的字母顺序也恰好是按时间顺序排列的(当在UTC中时,并且与解析为第二个字符串的全部或部分时一致)
连字符是可选的,规范将其视为格式的“基本”版本;我建议包括连字符,除非存储/内存严重不足。连字符使字符串可以识别为日期-时间表示形式,并且更易于人类阅读
在创建报告、导出数据、编写XML或JSON或以其他方式交换数据时,我建议几乎总是使用这些标准格式。两者都是新的java。Java 8及更高版本中内置的时间框架,(b)Joda时间库在解析和生成日期时间值的字符串表示时默认使用这些格式
规格不一致
请注意,虽然ISO 8601和SQL标准都有几十年的历史,但它们似乎没有交叉。SQL标准有相似的格式,但并不完全相同。具体来说,ISO 8601在日期和时间部分之间使用
T
,而SQL规范从来没有这样做还有一些专有类型使用自己的字符串格式,例如Oracle 11g使用
DD-MON-YY
作为DATE
类型的默认值,例如'13-NOV-92'
爪哇。时间
爪哇。Java 8及更高版本中内置的时间框架通过在括号中添加时区名称扩展了日期时间的ISO 8601格式
该标准仅使用offset-from-UTC。真正的时区是一个偏移量加上一组规则,用于对异常进行调整,例如Daylight Savings Time (DST)
使用数据类型,卢克
与其他评论一样,我强烈建议您学习并使用数据库的原生数据类型进行日期时间工作。有些像SQLite对日期时间的支持很弱,但大多数都有相当好的支持(比如H2和Postgres)
这些数据类型差异很大。SQL规范定义了一些,但有些数据库(如Oracle)还具有专有类型。这些专有类型通常是过时的类型
即使是标准的数据类型也不是那么标准。你应该在你的项目之外进行游戏和实验,以巩固你对他们行为的理解
你遇到的“问题”很可能是对具体类型或日期时间处理方式的误解。如果是这样,从长远来看,滚动自己的数据类型(通过字符串)只会加剧问题。花点时间搜索StackOverflow,了解日期时间处理。约会时间这个话题出人意料地棘手
数字
至于使用数字作为自己的日期时间类型,几乎所有原生日期时间数据类型都在内部使用数字。因此,做自己的事情没有性能优势