Как задать интервал дат в sql

от admin

Предикат SQL BETWEEN — поиск значений из указанного интервала

С помощью предиката SQL BETWEEN можно извлечь из таблицы строки, в которых значения некоторого проверяемого столбца находятся в интервале, границы которого обозначены некоторым выражением. Границы интервала также включены в него.

Запросы с предикатом SQL BETWEEN имеют следующий синтаксис:

Если перед предикатом BETWEEN поставить ключевое слово NOT, то в выборку попадут строки, в которых значение проверяемого столбца находится за пределами интервала: до ВЫРАЖЕНИЯ_1 и после ВЫРАЖЕНИЯ_2.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .

В первых примерах работаем с базой данных «Компания 2», содержащей данные о заработной плате сотрудников. Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными — в файле по этой ссылке .

Запросы с BETWEEN: интервал задан указанными числами

В самых простых запросах с предикатом BETWEEN границы интервала для проверяемого столбца заданы непосредственным указанием числовых значений.

Пример 1. Итак, работаем с базой данных фирмы и её таблицей Staff, содержащей данные о заработной плате сотрудников.

ID Name Salary
1 Sanders 18357.5
2 Pernal 15430.0
3 Marenghi 17506.8
4 Doctor 12322.4
5 Factor 16228.7
6 Junkers 16232.8
7 Moonlight 21500.6
8 Aisen 19540.7
9 MacGregor 15790.8

Требуется вывести сотрудников, заработная плата которых находится в интервале от 16 000 до 18 000. Пишем следующий запрос с предикатом BETWEEN:

Запрос выведет следующую результирующую таблицу:

ID Name Salary
3 Marenghi 17506.8
5 Factor 16228.7
6 Junkers 16232.8

Пример 2. База данных и таблица — те же, что в примере 1. Требуется вывести сотрудников, заработная плата которых находится вне интервала от 16 000 до 18 000. Пишем следующий запрос с предикатом BETWEEN, перед которым ставим ключевое слово NOT:

Запрос выведет следующую результирующую таблицу:

ID Name Salary
1 Sanders 18357.5
2 Pernal 15430.0
4 Doctor 12322.4
7 Moonlight 21500.6
8 Aisen 19540.7
9 MacGregor 15790.8

Запросы с BETWEEN: интервал задан вложенными запросами

В запросах с BETWEEN границы интервала для проверяемого столбца можно не указывать явно, задав его некоторыми условиями, которые определены вложенными запросами.

Пример 3. Продолжаем работать с базой данных Staff. Требуется вывести сотрудников, заработная плата которых находится в интервале между средней и максимальной. Пишем следующий запрос, в котором границы заданы вложенными запросами:

Результатом выполнения запроса будет следующая таблица:

ID Name Salary
1 Sanders 18357.5
3 Marenghi 17506.8
7 Moonlight 21500.6
8 Aisen 19540.7

Пример 4. База данных и таблица — те же. Требуется вывести сотрудников, заработная плата которых находится в интервале между заработной платой сотрудника MacGregor и заработной платой сотрудика Marenghi. Пишем следующий запрос, в котором границы заданы вложенными запросами:

Результатом выполнения запроса будет следующая таблица:

ID Name Salary
3 Marenghi 17506.8
5 Factor 16228.7
6 Junkers 16232.8
9 MacGregor 15790.8

Как видим, граничные значения интервала попали в результирующую таблицу.

Написать запрос с предикатом BETWEEN самостоятельно, а затем посмотреть решение

Пример 5. Продолжаем работать с таблицей Staff. Требуется вывести сотрудников с ID между ID сотрудника Marenghi и ID сотрудника Moonlight.

Запросы с BETWEEN: интервал задан значениями даты и времени

Интервал для извлечения строк с помощью предиката BETWEEN может быть задан не только значениями числового типа данных, но и значениями даты и времени.

Далее работаем с базой данных «Недвижимость». Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными — в файле по этой ссылке .

Пример 6. Итак, работаем с базой данных «Недвижимость».

Таблица Deal содержит данные о сделках. Нам потребуется столбец Date, в котором указывается дата совершения сделки. Для упрощения будем считать, что в таблице представлены сделки, заключённые в течение одного года. Требуется вывести сделки, заключённые в августе и сентябре. Пишем следующий запрос:

Примеры запросов к базе данных «Недвижимость» есть также в уроках по оператору GROUP BY, предикату EXISTS, функциям ALL и ANY и LIMIT.

Команда INTERVAL

Команда INTERVAL позволяет прибавлять к дате и отнимать от нее определенные промежутки времени.

Синтаксис

После команды INTERVAL можно указывать определенную часть даты (день, месяц или год и тп), к примеру, так INTERVAL 1 DAY или INTERVAL 3 MONTH, или сразу несколько частей.

В этом случае значения даты берутся в кавычки, пример: давайте прибавим 1 год и 3 месяца — это будет выглядеть так: INTERVAL ‘1-3’ YEAR_MONTH.

Мы указываем, что хотим год и месяц (вот так: YEAR_MONTH), и перед этим в кавычках пишем сначала значение для года, потом значение для месяца. Между ними ставим разделитель (он может быть абсолютно любым).

Смотрите список возможных комбинаций (разделители указаны для примера, они могут быть любыми):

Значение Ожидаемый формат
SECOND секунды
MINUTE минуты
HOUR часы
DAY дни
MONTH месяцы
YEAR года
MINUTE_SECOND «минуты:секунды»
HOUR_MINUTE «часы:минуты»
DAY_HOUR «дни часы»
YEAR_MONTH «года-месяцы»
HOUR_SECOND «часы:минуты:секунды»
DAY_MINUTE «дни часы:минуты»
DAY_SECOND «дни часы:минуты:секунды»

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
date
дата
1 Дима 2010-03-01 12:01:02
2 Петя 2011-04-02 13:02:03
3 Вася 2012-05-03 14:03:04

Пример

В данном примере к дате прибавляется 1 день:

SQL запрос выберет следующие строки:

id
айди
name
имя
date
дата
new_date
новая дата
1 Дима 2010-03-01 12:01:02 2010-03- 02 12:01:02
2 Петя 2011-04-02 13:02:03 2011-05- 03 13:02:03
3 Вася 2012-05-03 14:03:04 2012-06- 04 14:03:04

Пример

В данном примере от даты отнимается 1 день:

SQL запрос выберет следующие строки:

id
айди
name
имя
date
дата
new_date
новая дата
1 Дима 2010-03-01 12:01:02 2010- 02-28 12:01:02
2 Петя 2011-04-02 13:02:03 2011-05- 01 13:02:03
3 Вася 2012-05-03 14:03:04 2012-06- 02 14:03:04

Пример

В данном примере к дате прибавляется 1 год и 2 месяца:

SQL запрос выберет следующие строки:

id
айди
name
имя
date
дата
new_date
новая дата
1 Дима 2010-03-01 12:01:02 2011-05 -01 12:01:02
2 Петя 2011-04-02 13:02:03 2012-06 -02 13:02:03
3 Вася 2012-05-03 14:03:04 2013-07 -03 14:03:04

Разделитель в запросе не имеет значения. Он может быть любым символом:

Можно использовать даже несколько символов:

Можно использовать и пробел:

Пример

В данном примере к дате прибавляется 1 год, 2 месяца и 1 день:

SQL запрос выберет следующие строки:

id
айди
name
имя
date
дата
new_date
новая дата
1 Дима 2010-03-01 12:01:02 2011-05-02 12:01:02
2 Петя 2011-04-02 13:02:03 2012-06-03 13:02:03
3 Вася 2012-05-03 14:03:04 2013-07-04 14:03:04

Запрос можно переписать таким образом:

Пример

В данном примере к дате прибавляется 1 год, отнимаются 2 месяца и прибавляется 1 день:

SQL — урок 2: Работа с датой и временем

Литералы служат для непосредственного представления данных, ниже приведен список
стандартных литерал:

  • целочисленные — 0, -34, 45;
  • вещественные — 0.0, -3.14, 3.23e-23;
  • строковые — ‘текст’, n’текст’, ‘don»t!’;
  • дата — DATE ‘2008-01-10’;
  • время — TIME ’15:12:56′;
  • временная отметка — TIMESTAMP ‘2008-02-14 13:32:02’;
  • логический тип — true, false;
  • пустое значение — null.

Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.

В MySQL для временных литерал строка должна быть заключена в скобки: DATE (‘2008-01-10’).

Формат даты по умолчанию обычно определяется настройкой БД. Продвинутые СУБД могут
автоматически определять некоторые форматы (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 интервалы используются в выражениях с временными типами данных,
использовать их в качестве конечного типа для столбцов запрещено.

Выражения и операции

Для построения выражений SQL включает стандартные операции, ряд дополнительных предикатов
(булевских конструкций) и функций. В MySQL для встроенных функций между именем и открывающей
скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной функции в БД.
Oracle не поддерживает логические выражения в перечислении select.

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 можно использовать и такие операции:

  • ^ — возведение в степень;
  • |/ — квадратный корень;
  • ||/ — кубический корень;
  • ! — постфиксный факториал;
  • !! — префиксный факториал;
  • @ — абсолютное значение.

Обзор функций

В арсенале каждой СУБД обязательно имеется набор встроенных функций для
обработки стандартных типов данных. В MySQL для встроенных функций между именем и
открывающей скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной
функции в БД. В некоторых СУБД, как Oracle, если функция не имеет аргументов,
то скобки можно опустить.

математические функции

  • 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) — тангенс.

строковые функции

  • ascii(string) — возвращает код первого символа, эта функция обратна функции CHR;
  • chr(x) — возвращает символ с номером х, в MySQL это функция char;
  • length(string) — возвращает длину строки;
  • lower(string) — понижает регистр букв;
  • upper(string) — повышает регистр букв;
  • ltrim(string1[, string2]) — удаляет слева из первой строки все символы
    встречающиеся во второй строке. Если вторая строка отсутствует, то удаляются пробелы. В MySQL
    второй аргумент не поддерживается;
  • rtrim(string1[, string2]) — аналогична функции ltrim, только удаление
    происходит справа;
  • trim(string) — удаляет пробелы с обоих концов строки;
  • lpad(string1, n[, string2]) — дополняет первую строку слева n символами из
    второй строки, при необходимости вторая строка дублируется. Если string2 не указана, то
    используется пробел;
  • rpad(string1, n[, string2]) — аналогична функции lpad, только присоединение
    происходит справа;
  • replace(string1, c1, c2) — заменяет все вхождения символа/подстроки c1 на c2.
    Для простого удаления всех вхождений c1, в качестве третьего аргумента надо указать пустую
    строку (»). В Oracle третий аргумент не обязателен, и по умолчанию равен пустой строке;
  • instr(string1, string2[, a][, b]) — возвращает b вхождение строки string2
    в строке string1 начиная с позиции a. Если a отрицательно, то поиск происходит справа. По
    умолчанию a и b присваиваются значение 1. В MySQL последние два аргумента не поддерживаются. В
    PostgreSQL данной функции нет, однако ее реализация дана в документации, как раз для
    совместимости с Oracle;
  • substr(string, pos, len) — возвращает подстрку с позиции pos и длины len.
Читать:
Что значит v в информатике

работа с датами

В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у 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 — национальные
параметры. Формат строки для даты задается следующими элементами:

  • «» — вставляет указанный в ковычках текст;
  • AD, A.D. — вставляет AD с точками или без точек;
  • ВС, B.C. — вставляет ВС с точками или без точек;
  • СС, SCC — вставляет век, SCC возвращает даты ВС как отрицательные числа;
  • D — вставляет день недели;
  • DAY — вставляет имя дня, дополненное пробелами до длины в девять символов;
  • DD — вставляет день месяца;
  • DDD — вставляет день года;
  • DY1 — вставляет сокращенное название дня;
  • FF2 — вставляет доли секунд вне зависимости от системы счисления;
  • НН, НН12 — вставляет час дня (от 1 до 12);
  • НН24 — вставляет час дня (от 0 до 23);
  • MI — вставляет минуты;
  • MM — вставляет номер месяца;
  • MOMn — вставляет сокращенное название месяца;
  • MONTHn — вставляет название месяца, дополненное пробелами до девяти символов;
  • RM — вставляет месяц римскими цифрами;
  • RR — вставляет две последние цифры года;
  • RRRR — вставляет весь год;
  • SS — вставляет секунды;
  • SSSSS — вставляет число секунд с полуночи;
  • WW — вставляет номер недели года (неделя — 7 дней от первого числа, а не от понедельника до воскресенья);
  • W — вставляет номер недели месяца;
  • Y.YYY — вставляет год с запятой в указанной позиции;
  • YEAR, SYEAR — вставляет год, SYEAR возвращает даты ВС как отрицательные числа;
  • YYYY, SYYYY — вставляет год из четырех цифр, SYYYY возвращает даты ВС как отрицательные числа;
  • YYY, YY, Y — вставляет соответствующее число последних цифр года.

Формат числовой строки задается следующими элементами:

  • $ — вставляет знак доллара перед числом;
  • В — вставляет пробелы для целой части десятичного числа, если она равна нулю;
  • 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 (день.месяц.год), то при выводе даты из базы данных, возникает необходимость в её преобразовании.

Преобразовать дату можно несколькими способами.

  1. при помощи php кода
  2. воспользовавшись командой 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() можно в любой вид и очередность при помощи подстановки ключей.

  • date_format(date,format) — дату в строку;
  • time_format(time,format) — время в строку;
  • format(number,precision) — число в cтроку типа ‘#,###,###.##’,
    где число знаков определяется вторым аргументом.

Ниже приведен список основных элементов форматирования для даты и времени:

SQL query to select dates between two dates

I have a start_date and end_date . I want to get the list of dates in between these two dates. Can anyone help me pointing the mistake in my query.

Here Date is a datetime variable.

shA.t's user avatar

Neeraj's user avatar

24 Answers 24

you should put those two dates between single quotes like..

keep in mind that the first date is inclusive, but the second is exclusive, as it effectively is ‘2011/02/27 00:00:00’

Since a datetime without a specified time segment will have a value of date 00:00:00.000 , if you want to be sure you get all the dates in your range, you must either supply the time for your ending date or increase your ending date and use < .

DO NOT use the following, as it could return some records from 2011/02/28 if their times are 00:00:00.000.

Tom Fenech's user avatar

The date values need to be typed as strings.

To ensure future-proofing your query for SQL Server 2008 and higher, Date should be escaped because it’s a reserved word in later versions.

Bear in mind that the dates without times take midnight as their defaults, so you may not have the correct value there.

Here, first add a day to the current endDate, it will be 2011-02-28 00:00:00 , then you subtract one second to make the end date 2011-02-27 23:59:59 . By doing this, you can get all the dates between the given intervals.

Sabyasachi Mishra's user avatar

Chandra Prakash's user avatar

— if data type is different

Hamze Sheyikh Shoaei's user avatar

This query stands good for fetching the values between current date and its next 3 dates

This will eventually add extra 3 days of buffer to the current date.

Vinit Kadkol's user avatar

This is very old, but given a lot of experiences I have had with dates, you might want to consider this: People use different regional settings, as such, some people (and some databases/computers, depending on regional settings) may read this date 11/12/2016 as 11th Dec 2016 or Nov 12, 2016. Even more, 16/11/12 supplied to MySQL database will be internally converted to 12 Nov 2016, while Access database running on a UK regional setting computer will interpret and store it as 16th Nov 2012.

Therefore, I made it my policy to be explicit whenever I am going to interact with dates and databases. So I always supply my queries and programming codes as follows:

Note also that Access will accept the #, thus:

but MS SQL server will not, so I always use » ‘ » as above, which both databases accept.

And when getting that date from a variable in code, I always convert the result to string as follows:

I am writing this because I know sometimes some programmers may not be keen enough to detect the inherent conversion. There will be no error for dates < 13, just different results!

As for the question asked, add one day to the last date and make the comparison as follows:

Hannington Mambo's user avatar

Try putting the dates between # # for example:

It worked for me.

halfer's user avatar

Aleksandar's user avatar

shA.t's user avatar

if its date in 24 hours and start in morning and end in the night should add something like :

This query will find Cities with more than 2 occurrences where their DOB is in a specified time range for employees.

Damini Suthar's user avatar

The logic being that >= includes the whole start date and < excludes the end date, so we add one unit to the end date. This can adapted for months, for instance:

best query for the select date between current date and back three days:

best query for the select date between current date and next three days:

Paresh Mayani's user avatar

Check below Examples: Both working and Non-Working.

AND below is not working:

Tobbin Well's user avatar

You ca try this SQL

Kamran's user avatar

I like to use the syntax 1 MonthName 2015 for dates ex:

Rakesh kumar Oad's user avatar

shA.t's user avatar

we can use between to show two dates data but this will search the whole data and compare so it will make our process slow for huge data, so i suggest everyone to use datediff :

here calender is the Table, dt as the starting date variable and dt2 is the finishing date variable.

There are a lot of bad answers and habits in this thread, when it comes to selecting based on a date range where the records might have non-zero time values — including the second highest answer at time of writing.

Never use code like this: Date between ‘2011/02/25’ and ‘2011/02/27 23:59:59.999’

Or this: Date >= ‘2011/02/25’ and Date <= ‘2011/02/27 23:59:59.999’

To see why, try it yourself:

In both cases, you’ll get both rows back. Assuming the date values you’re looking at are in the old datetime type, a date literal with a millisecond value of 999 used in a comparison with those dates will be rounded to millisecond 000 of the next second, as datetime isn’t precise to the nearest millisecond. You can have 997 or 000, but nothing in between.

You could use the millisecond value of 997, and that would work — assuming you only ever need to work with datetime values, and not datetime2 values, as these can be far more precise. In that scenario, you would then miss records with a time value 23:59:59.99872, for example. The code originally suggested would also miss records with a time value of 23:59:59.9995, for example.

Far better is the other solution offered in the same answer — Date >= ‘2011/02/25’ and Date < ‘2011/02/28’ . Here, it doesn’t matter whether you’re looking at datetime or datetime2 columns, this will work regardless.

Похожие статьи