MySQL支持历史日期(如1200)吗?

时间:2010-03-21 15:16:46

标签: mysql

我看不到任何关于此的信息。我在哪里可以找到Mysql可以支持的最早日期?

7 个答案:

答案 0 :(得分:33)

答案 1 :(得分:11)

来自documentation

  

<强> DATE

     

约会。支持的范围是'1000-01-01'到   '9999-12-31'。

答案 2 :(得分:5)

是。 MySQL dates从1000年开始。

答案 3 :(得分:4)

无论它值多少,我发现MySQL DATE字段确实支持日期&lt;实际上是1000,尽管文档说不然。例如,我能够输入325并将其存储为0325-00-00。搜索WHERE table.date < 1000也给出了正确的结果。

但我犹豫是否依赖&lt; 1000个日期,当他们没有得到官方支持时,加上我有时需要超过4位数的BCE年份(例如10000 BCE)。因此,年,月,日(如上所述)的单独INT字段似乎是唯一的选择。

我希望DATE类型(或者可能是新的HISTDATE类型)支持完整的历史日期 - 将三个字段合并为一个并按日期排序而不必按{{1}排序会很好}。

答案 4 :(得分:3)

这是一个重要且有趣的问题,它有另一个解决方案。

不依靠数据库平台来支持具有毫秒精度的潜在无限数量的日期,而是依靠面向对象的编程语言编译器和运行时来正确处理日期和时间算法。

可以使用Java虚拟机(JVM)执行此操作,其中时间以毫秒为单位,相对于1970年1月1日午夜UTC(Epoch),通过在数据库中将所需值保持为long(包括负值),并在检索后在组件层中执行所需的转换/计算。

例如:

Date d = new Date(Long.MIN_VALUE);
DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy G HH:mm:ss Z");
System.out.println(df.format(d));

应该显示: 太阳,12月2日292269055 BC 16:47:04 +0000

这也使数据库版本和平台具有独立性,因为它将所有日期和时间算法抽象到JVM运行时,即数据库版本和平台的变化将不太可能需要重新实现(如果有的话)。

答案 5 :(得分:2)

使用SMALLINT年份,因此年份将从-32768(BC)到32768(AD)接受 对于月和日,请使用TINYINT UNSIGNED

大多数历史事件都没有月份和日期,因此您可以像这样查询:

SELECT events FROM history WHERE year='-4990'

结果:'Noah Ark'

或者:SELECT events FROM history WHERE year='570' AND month='4' AND day='20' 回归:“Muhammad pbuh出生了”

根据要求,您还可以添加DATETIME列,并在1000之前将其设为NULL,反之亦然(从而节省一些字节)

答案 6 :(得分:2)

我有类似的问题,我想继续在数据库中的日期字段中继,以允许我使用日期范围搜索,精确度达到历史值的一天。 (我的DB包括出生日期和罗马皇帝的日期......)

解决方案是在将所有日期添加到数据库之前向所有日期添加常量(例如:3000),并在向用户显示查询结果之前减去相同的数字。

如果DB中已经有一些日期值,请记住使用新的const数更新exiting值。