#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