Как сделать календарь sql
PHP-класс для вывода календаря на месяц, год или любой другой интервал с возможностью выделить отдельные даты и вывести к ним подсказки.
Далее приведены варианты использования класса и живые примеры.
Календарь на месяц
Вывод календаря на текущий месяц:
Результат:
Календарь на три месяца
Результат:
Календарь на год
Вывод календаря на текущий год с выделенными днями праздников и других событий.
В массиве $events даты могут быть в следующем формате:
Чтобы вставить текущую дату в форме Access, воспользуйтесь элементом выбора даты. Если поле обозначено как поле даты и времени, при щелчке в нем появляется значок "Выбор даты". Щелкните его, а затем нажмите кнопку Сегодня под календарем.
Сочетание клавиш. Чтобы вставить текущую дату в выбранное поле классической базы данных Access, одновременно нажмите клавиши CTRL и точку с запятой (;).
Дополнительные сведения о добавлении поля "Дата/время" в таблицу см. в поле "Создание поля для хранения даты и времени". Дополнительные сведения о формах см. в теме "Создание формы Access".
Вставка значения по умолчанию для новых элементов
Большинство полей и элементов управления Access имеют свойство Значение по умолчанию, где можно ввести функцию, которая вставляет текущую дату каждый раз при создании нового элемента. Функция Now() используется для вставки текущей даты и времени и в классической базе данных, и в веб-приложении Access. Если необходимо вставить только дату, используйте функцию Date() в классической базе данных или функцию Today() в веб-приложении Access.
Куда вводить функцию?
Выберите необходимую процедуру, исходя из типа объекта, который необходимо изменить. Обратите внимание, что при установке значения по умолчанию в таблице, это значение будет применено ко всем формам и представлениям на основе таблицы, поэтому этот метод обычно является предпочтительным.
В таблице
Вот как найти свойство "Значение по умолчанию" в таблице классической базы данных или веб-приложения Access:
Если область навигации не открыта, нажмите F11, чтобы открыть ее.
В области навигации щелкните таблицу правой кнопкой мыши и выберите пункт "Конструктор".
Щелкните поле, для которого необходимо установить значение по умолчанию, а затем в его свойствах, в поле Значение по умолчанию, введите =Date(), =Today() или =Now().
В форме (базы данных на компьютере)
Если область навигации не открыта, нажмите F11, чтобы открыть ее.
В области навигации щелкните форму правой кнопкой мыши и выберите пункт "Режим макета".
Выберите поле, в которое необходимо вставить сегодняшнюю дату.
Если окно свойств не открыто, нажмите F4, чтобы открыть его.
На вкладке "Все" в окне свойств убедитесь, что для свойства "Показать выбор даты" установлено свойство "Для дат".
На странице свойств на вкладке "Данные" введите =Date() в поле свойства Значение по умолчанию.
Примечание: Если необходимо включить не только текущую дату, но и время, используйте функцию Now() вместо функции Date(). Вам также может понадобиться настроить свойство Формат поля (на вкладке Формат окна свойств), чтобы настроить отображение времени.
В верхней части отчета
Чтобы отобразить текущую дату в заголовке отчета (только для баз данных на компьютере), откройте отчет в режиме макета, а затем на вкладке Конструктор нажмите кнопку Дата и время.
Дополнительные сведения о создании отчетов см. в статье Основные сведения об отчетах в Access.
В SQL
Чтобы заменить значение в поле даты текущей датой в классической базе данных Access, можно использовать запрос на обновление. Например:
UPDATE TASKS SET StartDate = Date() WHERE >
Дополнительные сведения о запросах на обновление см. в статье Создание и запуск запроса на обновление.
Чтобы вставить новую запись с текущей датой, используйте запрос на добавление, как показано в примере:
INSERT INTO TASKS ( TaskTitle, StartDate ) VALUES ("Task2", Date());
Дополнительные сведения о запросах на добавление см. в статье Добавление записей в таблицу с помощью запроса на добавление.
Примечание: Если необходимо включить не только текущую дату, но и время, используйте функцию Now() вместо функции Date().
Я проверил несколько более старых вопросов, касающихся этой темы, как этот: Календарь повторяющихся/повторяющихся событий - лучший метод хранения, однако ответы довольно плохи и сложны в реализации. Из другого ответа легко понять, почему принятый ответ - плохая идея: месяц событий принимает 90 запросов. Это неприемлемо.
В любом случае, здесь проблема, с которой я сталкиваюсь, чтобы вы не перечитывали эти вопросы:
Буду признателен за любую помощь! Я прочитал пару статей по этой теме и до сих пор не могу найти что-то, что я могу сделать в SQL.
1 ответ
Решение, которое я придумал, состоит в том, что у меня есть таблица событий, в которой есть пять полей, определяющих повторение события, как определено ниже. Затем у меня также есть таблица расписания, в которой я заполняю фактическое появление событий. Мне нужна дата окончания, и даже когда они указывают что-то, выходящее на пару лет, это событие месяца, которое не создает столько записей в таблице расписания.
Таким образом, событие хранится в таблице событий с startDateTime и endDateTime, которые описывают всю продолжительность события, если нет повторения. Эти два поля datetime также определяют общий запуск и конец события, если это повторяющееся событие. В той же таблице событий мы имеем пять полей, определяющих повторение, как изложено ниже.
Таблица расписания хранит отдельные вхождения каждого события. Таким образом, он имеет eventId, startDateTime и endDateTime. Это начало и конец относятся только к каждому событию, а не к общему диапазону.
Для запроса всех запланированных событий, происходящих за определенный промежуток времени, я просто запрашиваю проверку таблицы расписания для любых вхождений, которые соответствуют этому условию:
Этот запрос дает мне только записи расписания, которые происходят частично или полностью в течение моего периода запроса. Для получения данных о событиях простое подключение к таблице событий.
Интересная часть - это вычисление чего-то вроде второго дня месяца. Это происходит в фактическом коде для определения всех запланированных событий для данного события. Я также прилагаю свой код для этого ниже.
ПОСЛЕДНИЕ СОБЫТИЯ
recurs 0 = нет повторения 1 = ежедневно 2 = еженедельно 3 = ежемесячно
recurs_interval - это сколько периодов между повторениями. Если событие повторяется каждые 5 дней, recurs_interval будет иметь 5, и recurs будет иметь 1. Если событие повторяется каждые 3 недели, recurs_interval будет иметь 3, а recurs будет иметь 2.
recurs_day Если пользователь выбрал ежемесячную повторяемость типа в определенный день месяца (например, 10-й или 14-й). У этой даты. Значение равно 0, если пользователь не выбирает месячный или определенный месяц повторения месяца. Значение равно от 1 до 31.
recurs_ordinal, если пользователь выбрал повторение ежемесячного типа, но порядковый тип дня (например: первый понедельник, второй четверг, последний пятница). Это будет порядковый номер. Значение равно 0, если пользователь не выбрал этот тип повторения. 1 = первый 2 = второй 3 = третий 4 = четвертый 5 = последний
recurs_weekdays для еженедельного и ежемесячного порядкового повторения, который хранит будние дни, где происходит повторение. 1 = воскресенье 2 = понедельник 4 = вторник 8 = среда 16 = четверг 32 = пятница 64 = суббота
Таким образом, каждые 4 недели в субботу и воскресенье будут повторяться = 2, recurs_interval = 4, recurs_weekdays = 65 (64 + 1). Аналогично, каждые три месяца в первую пятницу месяца будут повторяться = 3, recurs_interval = 3, recurs_ordinal = 1, recurs_weekdays = 32
Литералы служат для непосредственного представления данных, ниже приведен список
стандартных литерал:
Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.
Формат даты по умолчанию обычно определяется настройкой БД. Продвинутые СУБД могут
автоматически определять некоторые форматы (DATE (‘2008.01.10’))
или как в Oracle имеют функцию преобразования (to_date(‘01.02.2003′,’dd.mm.yyyy’)).
Для упрощения во многих СУБД там, где подразумевается дата,
перед строкой необязательно ставить имя типа.
Интервал времени
Синтаксис и реализация интервалов отличается на разных СУБД.
Oracle
PostgreSQL
интервалы указываются в виде строки, в которой перечисляются значение и тип промежутка:
- microsecond — микросекунды;
- millisecond — милисекунды;
- second — секунды;
- minute — минуты;
- hour — часы;
- day — дни;
- week — недели;
- month — месяцы;
- year — года;
- century — век;
- millennium — тысячелетие.
Слова можно употреблять и во множественном числе.
Если интервал начинается с дней, то можно использовать короткий формат строки как
в Oracle для дневных интервалов.
MySQL
Только сложные интервалы, состоящие из более одного типа промежутков, указываются в строке.
Для этих целей введены дополнительные по сравнению с PostgreSQL имена для промежутков:
- second_microsecond — секунды и микросекунды, формат строки ‘s.m’;
- minute_microsecond — минуты и микросекунды, формат строки ‘m.m’;
- minute_second — минуты и секунды, формат строки ‘m:s’;
- hour_microsecond — часы и микросекунды, формат строки ‘h.m’;
- hour_second — часы, минуты и секунды, формат строки ‘h:m:s’;
- hour_minute — часы и минуты, формат строки ‘h:m’;
- day_microsecond — день и микросекунды, формат строки ‘d.m’;
- day_second — дни, часы, минуты и секунды, формат строки ‘d h:m:s’;
- day_minute — дни, часы и минуты, формат строки ‘d h:m’;
- day_hour — дни и часы, формат строки ‘d h’;
- year_month — года и месяцы, формат строки ‘y-m’.
MySQL интервалы используются в выражениях с временными типами данных,
использовать их в качестве конечного типа для столбцов запрещено.
Выражения и операции
cтроковые операции
|| — соединение строк, в некоторых СУБД операнды автоматически преобразуются в
строковый тип. В MS Access используется &
алгебраические операции
- + — сложение;
- — — вычитание;
- * — умножение;
- / — деление;
- mod — остаток от деления. Oracle: mod(6,2). MySql: 6 mod 2.
Операции + и — также используются при работе со временем и интервалами.
В Oracle и PostgreSQL возможна разница между датами.
Результат возвращается в виде интервала в днях. Ниже приведен пример добавления к дате
интервала.
Ко времени можно прибавлять целое число, но результат зависит от конкретной СУБД.
операции отношения
- — больше;
- >= — больше либо равно;
- = — равно;
- <>,!= — не равно;
логические операции и предикаты
- and — логическое и;
- or — логическое или;
- nor — отрицание;
- between — определяет, находится ли значение в указанном диапазоне:
выражение IN (значение1. значениеn)
В качестве множества значений может служить корректная выборка
условные выражения
- case — условный оператор, имеющий следующий синтаксис:
- decode(expr,s1,r1[,sn,rn][,defr]) — сравнивает выражение expr с каждым выражением si
из списка. Если выражения равны то возвращается значение равное ri. Если ни одно
из выражений в списке не равно expr, то возвращается defr или NULL, если defr не было указано.
Эта функция доступна только в Oracle и в большинстве случае заменяет оператор CASE; - coalesce(arg1,…,argn) — возвращает первый аргумент в списке не равный null. Для двух
аргументов в Oracle можно воспользоваться функцией nvl; - greatest(arg1,…,argn) — возвращает наибольший аргумент в списке;
- least(arg1,…,argn) — возвращает наименьший аргумент в списке;
- nullif((arg1,arg2) — возвращает null если два аргумента равны, иначе первый
аргумент.
Ниже приведен пример использования выражения в запросе выбора данных.
прочие операции
В каждой СУБД свой набор операций, выше были приведены наиболее употребительные.
Например, в PosgreSQL можно использовать и такие операции:
- ^ — возведение в степень;
- |/ — квадратный корень;
- ||/ — кубический корень;
- ! — постфиксный факториал;
- !! — префиксный факториал;
- @ — абсолютное значение.
Обзор функций
математические функции
- abs(x) — абсолютное значение;
- ceil(x) — наименьшее целое, которое не меньше аргумента;
- exp(x) — экспонента;
- floor(x) — наибольшее целое, которое не больше аргумента;
- ln(x) — натуральный логарифм;
- power(x, y) — возводит x в степень y;
- round(x [,y]) — округление x до y разрядов справа от десятичной точки. По умолчанию
y равно 0; - sign(x) — возвращает -1 для отрицательных значений x и 1 для положительных;
- sqrt(x) — квадратный корень;
- trunc(x [,y]) — усекает x до у десятичных разрядов. Если у равно 0
(значение по умолчанию), то х усекается до целого числа. Если у меньше 0, от отбрасываются
цифры слева от десятичной точки.
Тригонометрические функции работают с радианами:
- acos(x) — арккосинус;
- asin(x) — арксинус;
- atan(x) — арктангенс;
- cos(x) — косинус;
- sin(x) — синус;
- tan(x) — тангенс.
строковые функции
работа с датами
В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:
- current_date — глобальная переменная содержащая текущую дату. Можно использовать и в других СУБД;
- trunc(d,s) — приводит дату к началу указанной временной отметки, например к началу месяца.
В PostgreSQL есть аналогичная функция date_trunc(s,d). В MySQL для этих целей может
использоваться функция date_format(d,s), но она возвращает результат в виде строки; - add_months(d,n) — добавляет к дате указанное число месяцев;
- last_day(d) — последний день месяца, содержащегося в аргументе;
- months_between(d1,d2) — возвращает число месяцев между датами.
Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:
- квартал — q, quarter;
- год — yyyy, year;
- месяц — mm, month;
- неделя — ww, week;
- день — dd, day;
- час — hh, hour;
- минута — mi, minute.
Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов.
Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.
Преобразование типов
Множество типов разрешенные для преобразования в констркуции CAST AS определяется
реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)],
char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer].
А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со
множеством записей в массивы.
В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить
собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть
собственный более удобный оператор преобразования типов .
В большинстве случае необходимо преобразование в строку либо из строки. Для этого случаяСУБД предоставляют дополнительные функции.
функции Oracle
- to_char(date [,format[,nlsparams]]) — дату в строку;
- to_char(number [,format[,nlsparams]]) — число в строку;
- to_date(string[,format[,nlsparams]]) — строку в дату;
- to_number( string [ ,format[, nlsparams] ]) — строку в число;
- to_timestamp(string, format) — строку во время.
В этих функциях format описание формата даты или числа, а nlsparams — национальные
параметры. Формат строки для даты задается следующими элементами:
Формат числовой строки задается следующими элементами:
- $ — вставляет знак доллара перед числом;
- В — вставляет пробелы для целой части десятичного числа, если она равна нулю;
- MI — вставляет знак минус в конце (например, ‘999.999mi’);
- S — вставляет знак числа в начале или в конце (например,’s9999′ или ‘9999s’);
- PR — записывает отрицательное число в уголвых скобках (например,’999.999pr’);
- D — вставляет разделитель десятичной точки в указанной позиции (например, ‘999D999’);
- G — вставляет групповой разделитель в указанной позиции (например,’9G999G999′). При этом дробная часть числа отбрасывается;
- С — вставляет ISO идентификатор валюты в начале или в конце числа (например, ‘с9999’ или ‘9999с’);
- L — вставляет локальный символ валюты в в начале или в конце числа (например, ‘l9999’ или ‘9999l’);
- , — вставляет запятую в указанной позиции вне зависимости от группового разделителя;
- . — вставляет десятичную точку в указанной позиции вне зависимости от разделителя десятичной точки;
- V — возвращает значение, умноженное на 10^n, где n равно числу девяток после V. В случае необходимости это значение округляется;
- ЕЕЕЕ — 9.99ЕЕЕЕ возвращает значение в экспоненциальной форме записи;
- RM — RM значение будет записано римскими цифрами в верхнем регистре;
- rm — rm значение будет записано римскими цифрами в нижнем регистре;
- 0 — вставляет нули, вместо пробелов в начале строки или в конце, например,
9990 вставляет нули, вместо пробелов в конце строки; - 9 — каждая 9 определяет значащую цифру.
функции PostgreSQL
- to_char(timestamp, format) — время в строку;
- to_char(interval, format) — интервал времени в строку;
- to_char(number, format) — число в строку;
- to_date(str, format) — строку в дату;
- to_number(str, format) — строку в число;
- to_timestamp(str, format) — строку во время.
Основные элементы форматирования совпадают с Oracle.
функции MySQL
При хранении даты в MySQL под типом Date (), она имеет формат 2011-07-11 (год-месяц-день). В некоторых случаях даже не имея разделителя 20110711.
Поскольку в русскоязычных странах более привычным к восприятию считается формат 11.07.2011 (день.месяц.год), то при выводе даты из базы данных, возникает необходимость в её преобразовании.
Преобразовать дату можно несколькими способами.
- при помощи php кода
- воспользовавшись командой DATE_FORMAT () при выборке из базы.
Первый способ применяется в тех случаях, когда необходимо вывести небольшое количество записей или же когда разработчик не подозревает о существовании второго способа.
Второй способ применим во всех случаях, вне зависимости сколько записей необходимо извлечь из базы, при этом он осуществляет минимальную нагрузку на сервер в отличии от способа с php кодом.
Рассмотрим пример выполнения:
Допустим существует таблица message , которая содержит ячейку send_data с датой в формате 2011-07-11 .
Для извлечения и преобразования даты напишем следующий код:
$message = mysql_fetch_array(mysql_query("SELECT DATE_FORMAT(send_data, '%e.%m.%Y') FROM message"));
Далее в том месте где необходимо вывести преобразованную дату, выводим массив $message любой, удобной для вас командой:
к примеру если в send_data находится 2011-05-03 то мы получим 03.05.2011 .
Номер индекса в массиве $message указываем каким по счету начиная от 0, в команде SELECT извлекается необходимое значение с преобразованной датой. К примеру при запросе:
$message = mysql_fetch_array(mysql_query("SELECT title, text, DATE_FORMAT(send_data, '%e.%m.%Y') FROM message"));
вывод даты будет осуществляться с индексом 2:
Преобразовать дату при помощи DATE_FORMAT() можно в любой вид и очередность при помощи подстановки ключей.
Ниже приведен список основных элементов форматирования для даты и времени:
Читайте также: