Хранение негрегорианских дат в типе даты Mysql

#php #mysql

#mysql #Дата #datetime #персидский-календарь

Вопрос:

У меня есть таблица mysql, в которой есть столбец с date типом.
Я собираюсь сохранить негрегорианскую дату в этом столбце (т.Е. Дату Джалали).
Я протестировал это, используя phpMyadmin и сохраняя дату Джалали, и никаких ошибок не произошло.
Хорошая ли идея хранить негрегорианские даты в date типе?
Если нет; что лучше? сохранение его как varchar или как timestamp или отметка времени как Int или что-то еще?

Ответ №1:

Хорошая ли идея хранить негрегорианские даты в типе даты?

Нет. Помимо того, что некоторая действительная дата в одной календарной системе не существует в другом календаре, функции, работающие с DATE типизированными столбцами, могут работать неправильно. Дело не просто в хранении данных, вам нужно обработать эти данные и, например, сравнить их с. CURDATE()

сохранение его как varchar или как timestamp или timestamp как Int или что-то еще?

Если вы выберете правильное форматирование, используйте две цифры для месяца и дня и статическое количество цифр для года, тип символьной строки CHAR или VARCHAR нормально. Сравнение темы друг с другом — это просто лексическое сравнение, и вы все равно можете написать свои функции или процедуры для расширения функциональности.

Выбор TIMESTAMP или DATE изменение вопроса, поскольку первый представляет определенное время, а второй представляет конкретную запись в календаре. Если вы хотите указать время рядом с датой, они все равно отличаются по значению. Вам следует подумать о таких проблемах, как переход на летнее время, из-за которого некоторые люди предпочитают указывать запись календаря (ДАТУ), а некоторые предпочитают секунды, прошедшие с 1 января 1970 года (ВРЕМЕННАЯ МЕТКА). например 1393-06-30 23:30:00 , в календаре Хиджры Шамси есть две временные метки, основанные на действующих законах правительства Ирана.

Комментарии:

1. Спасибо; мне, наконец, удалось сначала преобразовать, а затем сохранить его как григорианскую дату, поскольку я думаю, что этот метод дает мне как вычисления даты mysql, так и правильность самой даты

2. @4r1y4n, позже возникнут проблемы с тем, как, например, группировать по месяцам.

Ответ №2:

Вы можете хранить негрегорианские даты в integer поле в базе данных.

Примеры:

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

используя это, вы можете запрашивать строки, чтобы найти конкретную дату и даты, <=> отличные от конкретной даты, но, к сожалению, вы не можете сравнивать их друг с другом.

Ответ №3:

Внутреннее хранилище и двоичный интерфейс почти всех систем баз данных не имеют ничего общего с календарями. вы просто сохраняете дату (и, возможно, время) в базе данных, не предоставляя никакой информации о календаре. Это всего лишь простое количество дней, секунд или миллисекунд, прошедших с определенного момента времени (обычно полночь 1970-01-01).

Итак, вам просто нужно предоставить абстракцию API для дат на вашем прикладном уровне. Все остальное будет работать. Вы преобразуете все свои даты в григорианскую или временную метку Unix и отправляете запросы в MySQL как обычно.

Ответ №4:

Негрегорианский календарь по-прежнему работает с помощью Year , Month , Day и Time поэтому его можно хранить в 4 отдельных столбцах, например:

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

Я делаю возможным хранение дат без преобразования и разрешаю группировать по Year и Month