请教个问题,为什么数据库的日期用字符串存,字符串格式是 20201027195800 这种

看了好几家公司的 Java 项目都有这么干的,一直想不通。

数据库是 Oracle,也有 MySQL 的。

除了这个以外,还有字符串做主键,AA0001 这种。

还有字符串做关联查询等等。

最骚的是字符串传参。。

感觉 Oracle 里的字符串是万能的。是他们太菜了还是我太菜了。。

相关文章

35 thoughts on “请教个问题,为什么数据库的日期用字符串存,字符串格式是 20201027195800 这种

  1. @wpblank
    @jingniao
    @cmdOptionKana

    你们说的整形存的可能是 unix 时间戳,这个很正常,特别是 PHP 的系统里比较常见,计算比较都很方便。

    但是这是年月日时分秒格式的,比较计算啥的都要用函数。

    不知道好处在哪,所以才问的。

    退一步说就算这种年月日时分秒的格式有某方面的优势,也应该用整形存吧,用字符串真的不用考虑索引的感受吗

  2. 本来就可以这么用,如果你要深究,就保存时间这件事情上,每个方法都会有缺点。

    首先字符串就是任意长度的整数,没什么区别。

    日期时间的存法很多,比如
    1. 用 unix timestamp,缺点是人类不能一眼看出来那是哪天。
    2. 用数据库内置的 datetime 类型,但 MySQL 的 datetime 有奇怪的行为还不能带时区。
    3. 用楼主说的这种,存字符串类型。
    4. 用楼主说的这种,存整数类型。

    4 比 3 省 6 个 byte 的空间。
    但是这个格式一定要从字符串转换过来,用的时候也必然要转回字符串,所以 3 比 4 节省一点 cpu 。

    实际上 3 和 4 的差别是无关紧要的事情,没人在乎 6 个 byte,也没人在乎那一点点 cpu 。
    但 1 和 2 的缺点是确实存在的。

  3. 当处理不好时区还有其他一些奇怪的问题的时候,字符串就是最优解,数字性能更好一些但是也更麻烦一点

  4. 如果他们存“20201027T195800+0800”也就是再加点无关紧要的佐料是不是就觉得没问题了?毕竟如果确实只在东八区用,+0800 写不写都知道。

  5. 对于接口来说,日期要么字符串传参,要么时间戳传参。还能有别的办法传参?反正我倾向于字符串传参,时间戳还得换算一下才能知道时间,不利于发现问题。

  6. @GopherDaily #6 +1 就是菜
    时间戳有时区而且索引比字符串要快得多,字符串是索引性能最低的,要不然要那么多整数类型干什么

  7. @xuanbg 有是有,json 的方式传{}或者传[]都可以的。
    比如传 [2020, 10, 27, 19, 58, 00] 还比主题的格式更方便眼 parse
    当然,ISO 8601 也是好的
    只是觉得主题这样毫无 “肉眼解析锚点” 的方式确实不太行。
    不过数据库是另一个问题,有日期格式优先日期格式,没有再看数据量级和需求综合分析,指不定最优方案是同时存储 timestamp 和字符串表示呢。

  8. @qiayue 时间戳的值没有时区,但获取这个值的时候就和时区有关系了。错误的系统时区将会导致获取到错误的时间戳。

  9. @xuanbg 不可能吧,ISO8601 对前端非常友好,js 标准库就支持 ISO8601,最流行的日期时间库 day.js 也重点支持 ISO8601 。

  10. 太懒了
    我手上的项目就遇到,给建表的人说字段属性跟注释有歧义,然后这家伙就直接把所有字段属性改为 varchar,所有的值含义都通过口口相传

  11. @wilsonWei 管什么,国企的开发只要文档够标准就行了,至于代码和数据库设计将就效率而不是质量,文档要求每一个功能点要够详细,截图要多。。。。

  12. @v2webdev
    用整数的话,32 位不够,那就要用 64 位的,占 8 bytes
    那个字符串是 14 个数字,14 bytes

    如果用定长的字符串,也就是不需要额外存长度,也不需要在结尾补一个 0,那就是差 6 bytes

  13. @wilsonWei 这些人就是懒,啥事都是扔给我们帮他们弄,还有另一个人脸识别项目,海康 sdk 部署 Linux 环境居然不知道把动态库扔到系统库中,还要让我周六帮他弄,明明海康的文档写得清清楚楚

发表评论

电子邮件地址不会被公开。 必填项已用*标注