在Mysql的日期类型中存储非公历日期

时间:2014-10-31 06:25:58

标签: mysql date datetime persian-calendar

我有一个mysql表,其中有一个date类型的列 我将在此专栏中存储非公历日期(即Jalali日期) 我使用phpMyadmin测试了这一点,并存储了Jalali日期并且没有发生错误 将非格里高利日期存储在date类型中是一个好主意吗?
如果不;哪个更好?将其存储为varchartimestamp或时间戳为Int或其他?

4 个答案:

答案 0 :(得分:5)

  

在日期类型中存储非公历日期是个好主意吗?

没有。除了一个日历系统中的某些有效日期在另一个日历中不存在之外,处理DATE类型列的函数可能无法正常工作。问题不仅仅是存储数据,您需要处理这些数据,例如将它们与CURDATE()进行比较。

  

将其存储为varchar或作为Int或其他内容的时间戳或时间戳?

如果选择正确的格式,请使用两位数字表示月份和年份的静态位数,字符串类型CHARVARCHAR可以。比较主题只是一个词汇比较,你仍然可以编写你的函数来扩展功能。

选择TIMESTAMPDATE会更改问题,因为前者代表特定时间,但后者代表日历中的特定条目。如果你想把时间放在日期旁边,它们的含义仍然不同。您应该考虑一些问题,例如夏令时变化会导致某些人更喜欢放置日历条目(DATE),有些人更喜欢从1970年1月1日开始的秒数(TIMESTAMP)。例如根据当前的伊朗政府法律,Hijri Shamsi日历中1393-06-30 23:30:00有两个时间戳。

答案 1 :(得分:0)

您可以将非格里高利日期存储在数据库的integer字段中。

示例:

  • year:1396, month:11, day:17 => 13961117‍‍‍‍‍
  • year:1393, month:4, day:9 => 13930409

通过使用此功能,您可以查询行以查找特定日期<=>的特定日期和日期,但不幸的是,您无法将它们相互比较。

答案 2 :(得分:0)

几乎所有数据库系统的内部存储和二进制接口都与日历无关。您只需将日期(可能是时间)存储到数据库中,不提供日历信息。它只是从特定时间点(通常是1970-01-01午夜)过去的简单天数,秒数或毫秒数。

因此,您只需要在应用程序层中提供日期的API抽象。其他一切都会奏效。您将所有日期转换为Gregorian或Unix时间戳,并像往常一样向MySQL发送查询。

答案 3 :(得分:0)

非公历日历仍由YearMonthDayTime操作,因此可以将其存储在4个单独的列中,例如:

CREATE TABLE `Calendar` (
    `Year` int,
    `Month` tinyint,
    `Day` tinyint,
    `Time` time
);

我可以存储日期而无需转换,并可以按YearMonth分组