我有一个mysql表,其中有一个date
类型的列
我将在此专栏中存储非公历日期(即Jalali日期)
我使用phpMyadmin
测试了这一点,并存储了Jalali日期并且没有发生错误
将非格里高利日期存储在date
类型中是一个好主意吗?
如果不;哪个更好?将其存储为varchar
或timestamp
或时间戳为Int
或其他?
答案 0 :(得分:5)
在日期类型中存储非公历日期是个好主意吗?
没有。除了一个日历系统中的某些有效日期在另一个日历中不存在之外,处理DATE
类型列的函数可能无法正常工作。问题不仅仅是存储数据,您需要处理这些数据,例如将它们与CURDATE()
进行比较。
将其存储为varchar或作为Int或其他内容的时间戳或时间戳?
如果选择正确的格式,请使用两位数字表示月份和年份的静态位数,字符串类型CHAR
或VARCHAR
可以。比较主题只是一个词汇比较,你仍然可以编写你的函数来扩展功能。
选择TIMESTAMP
或DATE
会更改问题,因为前者代表特定时间,但后者代表日历中的特定条目。如果你想把时间放在日期旁边,它们的含义仍然不同。您应该考虑一些问题,例如夏令时变化会导致某些人更喜欢放置日历条目(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)
非公历日历仍由Year
,Month
,Day
和Time
操作,因此可以将其存储在4个单独的列中,例如:
CREATE TABLE `Calendar` (
`Year` int,
`Month` tinyint,
`Day` tinyint,
`Time` time
);
我可以存储日期而无需转换,并可以按Year
和Month
分组