|
|
|
| День добрый!
Есть небольшой вопрос гуру php.
Делаю блог "Знаменательные даты", в которм будут храниться полные даты (т.е. заданы год, месяц и день) и даты, у которых день не известен.
Как можно организовать такое хранение дат, чтобы к дате без дня можно было прибавит года или месяца?
Попробовал формат YYYY-MM-00, данные вставляются в поле типа дата, но при обработке MySQL возвращает NULL. | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 12:49)
| | Хм... а почему бы не воспользоваться типом DATE, а при выборке просто не учитывать день? Кроме того, что имеется в виду под "обработкой"? | |
|
|
|
|
|
|
|
для: cheops
(29.01.2009 в 14:48)
| | Я имел ввиду операции | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 17:53)
| | что "операции"?
К дате первого числа месяца можно прибавить чего угодно, и отнять тоже. | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 12:49)
| | Чем не устраивает YYYY-MM-01 ? | |
|
|
|
|
|
|
|
для: Trianon
(29.01.2009 в 14:55)
| | Я пологаю тем, что при выборке не будет понятно, нужно выводить день или только месяц. | |
|
|
|
|
|
|
|
для: Trianon
(29.01.2009 в 14:55)
| | Допустим есть дата, например, 01.1969 г. (конкретный день неизвестен) - какой-то значимый день в году, но он не должен выводиться каждый год, а лишь тогда, когда будет "юбелей" (5, 10, 15, 25, ,,,, лет). Чтобы ее вывести, надо получается вычесть из текущей даты дату 01.1969. Но MySQL не работает с датами у которых день например 0.
Если просто писать 01, то это же получаеться противоречить истории. Уж лучше ничего не писать, чем писать неправду.
Конечно можно это решить написав функции на PHP, но хочеться сначала попробовать это сделать стандартными средствами MySQL. | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 18:06)
| | >Допустим есть дата, например, 01.1969 г (конкретный день неизвестен)
Это не дата. Дата задает точку на временной оси с точностью до суток.
>Если просто писать 01, то это же получаеться противоречить истории.
>Уж лучше ничего не писать, чем писать неправду.
Нагружать на поле даты несвойственную этому типу функцию - еще хуже.
Вы можете хранить две даты (начало и конец интервала) .
Можете хранить дату и логический признак неопределенности дня месяца (в отдельном поле, само собой).
Писать неправду Вам так или иначе придется, поскольку точной информацией Вы не обладаете.
>Конечно можно это решить написав функции на PHP,
>но хочеться сначала попробовать это сделать стандартными средствами MySQL.
сделать что? | |
|
|
|
|
|
|
|
для: Trianon
(29.01.2009 в 18:15)
| | >Можете хранить дату и логический признак неопределенности дня месяца (в отдельном поле, само собой).
Тоже думал про такой способ. Думаю он пока самый оптимальный для такой задачи.
>сделать что?
Вычесть знаменательную дату из текущую даты, чтобы узнать является ли она юбилейной. | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 18:47)
| | >Вычесть знаменательную дату из текущую даты, чтобы узнать является ли она юбилейной.
Окей. Знаменательная дата 1969-01-XX . Текущая - сегодняшняя.
Как Вы хотите вычитать даты? | |
|
|
|
|
|
|
|
для: Trianon
(29.01.2009 в 19:08)
| | Для чего мне нужно получить разницу дат? А для того чтобы узнать "юбилейная" она или нет и ВСЕ. Для этого достаточно получить разницу в месяцах м/у этими датами и сравнить с числом 60. Есть функция в MySQL: 'PERIOD_DIFF(YYYYMM, YYYYMM)' ( недавно обнаружил :) ), которая как раз и возвращает такую разницу и в ней можно не указывать день.
Я думаю задача решилась. | |
|
|
|
|
|
|
|
для: Adj
(29.01.2009 в 12:49)
| | Я бы завел три поля, для года, месяца и дня. Не нужный атрибут можно оставить как NULL и потом не выводить его.
А выборка была бы примерно такой:
SELECT *
FROM events
ORDER BY year, month, day | |
|
|
|
|
|
|
|
для: Temnovit
(29.01.2009 в 18:06)
| | Можно и так конечно.
Спасибо за ответы.
Буду эксперементировать, рассмотрю и Ваш вариант. | |
|
|
|
|
|
|
|
для: Temnovit
(29.01.2009 в 18:06)
| | Выполнять обычные арифметические операции над таким набором полей (как над моментом времени) будет весьма затруднительно. | |
|
|
|