Как сравнивать даты в sql
Покинул форум
Сообщений всего: 24
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Доброе время суток. Столкнулся с такой проблемой.
В базе время в формате datetime, записывается через sql запросы функцией NOW().
Мне нужно взять из базы количество записей, которые были добавлены сегодня, но просто сравнивать с функцией $date с параметрами Y-m-j не получилось.
Подскажите, как это можно сделать ? Знаю, что можно взять первые n чисел из записи даты в базе и сравнить с выводом $date(Y-m-j). Но как ?
Отправлено: 26 Июля, 2010 — 21:38:55
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 617 раз(а)
Блог веб-разработчика
MySQL: cравнение даты (datetime) через оператор BETWEEN
Category: MySQL — ingvar @ 20:29
Оператор BETWEEN идеально подходит для сравнения диапазона между датами (datetime). Но тут есть подводные камни. Например, есть задача — выбрать данные из таблицы за некоторый промежуток времени (с ‘2008-08-14’ по ‘2008-08-23’).
Рекомендации:
1. Выполняя любые сравнения, приводить все данные к одному типу.
2. Если один операнд имеет значение типа TIMESTAMP или DATETIME, а другой является константой, операнды сравниваются как значения типа TIMESTAMP. А это значит, что если была строка в виде ‘2008-08-14’, то она автоматически преобразуется в TIMESTAMP ‘2008-08-14 00:00:00’ и это влияет на результат запроса.
3. Над данными, которые участвуют в условиях сравнения желательно не делать никаких операций — это позволяет для них использовать индексы, иначе они игнорируются.
Примеры запросов с BETWEEN и без него:
# Поле created_at - тип DATETIME # КОРРЕКТНЫЕ ЗАПРОСЫ # 1: Индексы для created_at поля не используются. # Условие BETWEEN '2008-08-14' AND '2008-08-23' # преобразуется в BETWEEN '2008-08-14 00:00:00' AND '2008-08-23 00:00:00'. SELECT * FROM news WHERE DATE(created_at) BETWEEN '2008-08-14' AND '2008-08-23'; # 2: Оператор BETWEEN не используем, но тоже не самый лучший вариант, индексы не используются SELECT * FROM news WHERE DATE(created_at) >= '2008-08-14' AND DATE(created_at) = '2008-08-14' AND created_atПолучаем самый лучший запрос:
SELECT * FROM news WHERE created_at BETWEEN STR_TO_DATE('2008-08-14 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2008-08-23 23:59:59', '%Y-%m-%d %H:%i:%s');
- Установка, настройка и запуск нескольких серверов MySQL для Windows
- Триггеры в MySQL
- Как определить оптимальный размер innodb_log_file_size
- Топ-100 советов по производительности MySQL
- Журнал общих запросов Mysql 5.1 general_log_file
PgSQL сравнить две даты (возможно NULL)
infprog.dtr и people.dtr - тип date и могут быть NULL.
В результате сравнение infprog.dtr и people.dtr
не выполняется для записей, имеющих NULL.
WinLin ★
09.07.07 11:37:38 MSD

Re: PgSQL сравнить две даты (возможно NULL)
Pi ★★★★★
( 09.07.07 12:16:41 MSD )
Re: PgSQL сравнить две даты (возможно NULL)
update infprog set people_id=
(select id from people where fm=infprog.fm AND im=infprog.im AND ot=infprog.ot AND dtr=infprog.dtr);
dtr = NULL - допускается!
. AND dtr=infprog.dtr OR dtr IS NULL); .
Непонятно.
WinLin ★
( 09.07.07 12:45:11 MSD ) автор топика
Re: PgSQL сравнить две даты (возможно NULL)
Это прильное поведение, т.к. любая операция c NULL за исключением IS/IS NOT возвращает NULL. Соответственно, оператор = тут использовать нельзя. Для NULL'ов, скорее всего понадобится отдельный запрос.
Как сравнивать даты в sql
подскажите, пожалста что неправильно делаю.
вот такой запрос не отрабатывает
select * from my_table where my_date = Date()
пишет, что 'Date' is not a recognized built-in function name.
my_date с data type 'datetime' - сюда из delphi записывается дата с помощью ADOQuery
ADOQuery1.SQL.Text:='insert into my_table (my_Date) VALUES (Convert(datetime, :DT1 ,102))'; AdoQuery1.Parameters.ParamByName('DT1').Value:=DateTimePicker1.DateTime;
дата в таблице 'my_table' выглядит вседующим образом 08.02.2011 16:25:33
мне надо сравнить с текущей датой.
Регистрация: 17.11.2010
Сообщений: 19,042
Вы хоть сообщите к какой базе или SQL-серверу обращаетесь, подобные функции имеют различные имена у них
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Форумчанин
Регистрация: 29.06.2008
Сообщений: 603
select * from my_table where (my_date >= :CurDate1 AND my_date < CurDate2) ADOQuery1.ParamByName('CurDate1').AsDateTime := Today; ADOQuery1.ParamByName('CurDate2').AsDateTime := Today + 1; ADOQuery1.Open;
Регистрация: 09.01.2008
Сообщений: 26,238
_Engine_, 1) Вы допустили ошибку в запросе (пропущено двоеточие)
2) зачем дёргать запрос с параметрами, если получение системной даты и так есть в сервере.
Ks2010,
Присоединяюсь к мнению Аватар — нужно знать, о какой конкретно СУБД идёт речь: MySQL, MS SQL, Firebird, Oracle.
и "юзать" конкретную функцию данной СУБД.
| Serge_Bliznykov |
| Посмотреть профиль |
| Найти ещё сообщения от Serge_Bliznykov |
