Sql дата и время в запросе: Урок 13. Функции даты и времени

mysql – SQL запрос выборки диапазонов дат

Помогите составить SQL запрос..

Есть таблица с датами:

id |   date     | startTime | endTime
---+------------+-----------+--------
 1 | 2018-06-02 |   00:00   |  02:00
 2 | 2018-06-02 |   02:00   |  04:00
 3 | 2018-06-02 |   18:00   |  19:00
 4 | 2018-06-02 |   21:30   |  22:00

Нужно достать из нее записи, которые затрагивают входящую дату.

Например входящая 2018-06-02 15:00-17:00 не вернет ни одной, а
2018-06-02 18:00-21:40 вернет 3 и 4 записи. Спасибо.

  • mysql
  • sql






5

DECLARE @InputData NVARCHAR(22) = '2018-06-02 18:00-21:40'
DECLARE @InputDate DATE = SUBSTRING(@InputData, 1,10)
DECLARE @InputTimeFrom TIME = SUBSTRING(@InputData, 12,5)
DECLARE @InputTimeTo TIME = SUBSTRING(@InputData, 18,22)
DECLARE @DataTable TABLE (id INT, date_column DATE, startTime TIME, endTime 
TIME)
INSERT INTO @DataTable(id, date_column, startTime, endTime) VALUES
(1 , '2018-06-02' , '00:00' , '02:00'),
(2 , '2018-06-02' , '02:00' , '04:00'),
(3 , '2018-06-02' , '18:00' , '19:00'),
(4 , '2018-06-02' , '21:30' , '22:00')
SELECT *
FROM @DataTable
WHERE date_column = @InputDate 
AND startTime BETWEEN @InputTimeFrom AND @InputTimeTo

Если поля типа varchar к этому типу нужно привести и переменные

Вот один из вариантов решения – будет работать только если начало \ конец периода за одну дату будет:

select * from test where date = '2018-06-02' and startTime < '21:40' and endTime > '18:00';

Здесь первое значение – конец запрашиваемого периода, второе – начало.

Пример можно погонять вот здесь.

Да, решение указано из предположения, что строки выводятся при пересечении интервала запроса и интервала в самой строчке таблицы. То есть при запросе с 18:30 до 21:40 тоже будут выводиться те же строчки.







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается




Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


Литералы в SQL

На прошлом уроке выводили строку, а если говорить более формальным языком, то так называемый строковый литерал.

SELECT "Hello world"

Литерал — это указанное явным образом фиксированное значение, например, число 12 или строка “SQL”.

Основными типами литералов в MySQL являются:

  • строковый
  • числовой
  • логический
  • NULL
  • литерал даты и времени

Строка — это последовательность символов, заключённых в одинарные (‘) или двойные (“) кавычки.
Например, ‘это строка’ и “это строка”.

Строки могут содержать специальные последовательности символов, начинающиеся с “\” (экранирующий символ). Они нужны для того, чтобы СУБД придала обычным символам (буквам и другим знакам) новое особое значение. Например, последовательность “\n” буквально означает “перевод строки”, а без предваряющего слеша это была бы обычная буква “n”.

  • SELECT "Строка Другая строка" as String
    

    String
    Строка Другая строка
  • SELECT "Строка \n Другая строка" as String
    

    String
    Строка
    Другая строка

Пример
Включает в себя целые и дробные числа. Разделительный знак для дробного числа — «.» (точка). 1, 2.9, 0.01
Может иметь только целую, дробную часть или обе сразу. .2, 1.1, 10
Может быть положительным и отрицательным числом (для положительного числа совсем не обязательно указывать знак). +1, -10, -2.2
Могут быть представлены в экспоненциальном виде. 1e3 (=1000) 1e-3 (=0.001)

Арифметические операторы

Для числовых литералов в SQL есть все привычные нам арифметические операторы:

Оператор Описание Пример
%, MOD Деление по модулю 11 % 5 = 1
* Умножение 10 * 16 = 160
+ Сложение 98 + 2 = 100
Вычитание 50 – 51 = -1
/ Деление 1 / 2 = 0. 5
DIV Целочисленное деление 10 DIV 4 = 2

Используя эти операторы можно построить любое арифметическое выражение, применяя стандартные правила арифметики.

Для примера:

SELECT (5 * 2 - 6) / 2 AS Result;

Result
2

Значения даты и времени могут быть представлены в формате строки или числа.

Например, если мы хотим указать какую-то дату в запросе, то мы можем это сделать с помощью строки “1970-12-30”, “19701230” или же числа 19701230.
В обоих случаях эти значения будут интерпретироваться как дата «30 декабря 1970 года».

Ниже приведён пример использования литерала даты:

SELECT * FROM FamilyMembers WHERE birthday > '1970-12-30'

Можете не обращать внимание на то, что конкретно делает данный запрос, мы это рассмотрим попозже. Сейчас нам важен именно синтаксис того, как мы можем указывать дату в запросе.

Кроме самой даты, мы можем также указывать отдельно время или же всё вместе.

Описание Формат
Дата Интерпретируется как дата со временем, равным нулю YYYY-MM-DD, YYYYMMDD

Вместо разделителя “-” можно использовать любой знак препинания.

Например:
‘2020-01-01’ = 1 января 2020, 00:00:00

Время Содержит только время без конкретной даты hh:mm:ss, hh:mm, hh, ss

Разделитель тоже можно опустить.

Например:
12:11 = 12:11:00

Дата и время Дата с возможностью задать конкретное время YYYY-MM-DD hh:mm:ss, YYYYMMDDhhmmss

Например:
‘20200101183030’ = 1 января 2020, 18:30:30

Логический литерал – значения TRUE и FALSE, означающие истинность и ошибочность какого-либо утверждения. При интерпретации запроса, MySQL преобразует их в числа: TRUE и FALSE становятся 1 и 0 соответственно.

Значение NULL означает “нет данных”, “нет значения”. Оно нужно, чтобы отличать визуально пустые значения, такие как строка нулевой длины или “пробел”, от того, когда значения вообще нет, даже пустого.

sql-сервер – простой SQL-запрос DateTime

спросил

Изменено
9 месяцев назад

Просмотрено
595 тысяч раз

Как запросить поле базы данных DateTime в пределах определенного диапазона?

Я использую SQL SERVER 2005

Код ошибки ниже

 ВЫБЕРИТЕ *
  ИЗ ТАБЛИЦЫ
 ГДЕ DateTime >= 04.12.2011 00:00:00
   И DateTime <= 05.05.2011 3:53:04
 

Обратите внимание, что мне нужно получить строки в пределах определенного диапазона времени. Например, временной диапазон 10 минут.

В настоящее время SQL возвращает с неверным синтаксисом рядом с «12».

1

Вы пропустили одинарную кавычку:

 SELECT *
ИЗ ТАБЛИЦЫ
ГДЕ DateTime >= '04.12.2011 00:00:00' И DateTime <= '25.05.2011 3:53:04'
 

Также рекомендуется использовать формат ISO8601 ГГГГ-ММ-ДДTчч:мм:сс.nnn[ Z ], так как этот формат не будет зависеть от локальной культуры вашего сервера.

 ВЫБЕРИТЕ *
ИЗ ТАБЛИЦЫ
ГДЕ
    DateTime >= '2011-04-12T00:00:00.000' И
    DateTime <= '2011-05-25T03:53:04.000'
 

4

Вам нужны кавычки вокруг строки, которую вы пытаетесь выдать за дату, и вы также можете использовать МЕЖДУ здесь:

 SELECT *
   ИЗ ТАБЛИЦЫ
  ГДЕ DateTime МЕЖДУ «12.04.2011 00:00:00» И «25.05.2011 3:53:04»
 

Примеры явного преобразования строк в даты при указании формата см. в ответе на следующий вопрос:

Преобразование строки Sql Server в дату

2

Это работало для меня как в SQL Server 2005, так и в 2008:

 SELECT * from TABLE
ГДЕ ИМЯ ПОЛЯ > {ts '2013-02-01 15:00:00. 001'}
  И ИМЯ ПОЛЯ < {ts '2013-08-05 00:00:00.000'}
 

Вы можете выполнить приведенный ниже код

 SELECT Time FROM [TableName], где DATEPART(YYYY,[Time])='2018' и DATEPART(MM,[Time])='06' и DATEPART(DD,[Time]) ='14
 
 ВЫБЕРИТЕ *
  ИЗ ТАБЛИЦЫ
 ГДЕ [DateTime] >= '2011-04-12 00:00:00'
   И [DateTime] <= '2011-05-25 3:35:04 AM'
 

Если это не сработает, напишите сценарий своей таблицы и разместите здесь. это поможет нам быстро дать вам правильный ответ.

 выберите getdate()
О/П
----
2011-05-25 17:29:44.763
выберите convert(varchar(30),getdate(),131) >= '04.12.2011 00:00:00'
О/П
---
06.22.1432 17:29:44:763
 

Другие уже говорили, что литералы даты в SQL Server должны быть заключены в одинарные кавычки, но я хотел добавить, что вы можете решить проблему смешения месяца и дня двумя способами (то есть проблему, когда 25 рассматривается как месяц, а 5 день) :

  1. Используйте явное преобразование Convert(datetime, 'datevalue', style) , где style — один из числовых кодов стиля, см. Приведение и преобразование. Параметр стиля предназначен не только для преобразования дат в строки, но и для определения того, как строки анализируются в даты.

  2. Использовать независимый от региона формат для дат, хранящихся в виде строк. Я использую 'yyyymmdd hh:mm:ss' или рассмотрите формат ISO, yyyy-mm-ddThh:mi:ss.mmm . На основе экспериментов НЕТ другой строки формата, не зависящей от языка. (Хотя я думаю, что вы можете указать часовой пояс в конце, см. ссылку выше).

0

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

пример...

... где приведение (дата-время как дата)> = приведение (дата-время как дата) И приведение (дата-время как дата) <= приведение (дата-время как дата)

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

sql server 2008 - как запросить объект Datetime по дате?

спросил

Изменено
11 лет, 11 месяцев назад

Просмотрено
15 тысяч раз

Я хочу запросить таблицу в соответствии с определенной датой, но проблема в том, что тип данных этого поля — datetime

 выберите * из поставщика, где created_Date = '2011-05-07 12:52:16. 830'
 

этот запрос возвращает результат

, но

 выберите * из поставщика, где created_Date = '2011-05-07'
 

нет результата

  • sql-server-2008

SQL Server 2008 имеет тип данных DATE . Вы можете бросить свои DATETIME до DATE и выполнить сравнение.

 ВЫБЕРИТЕ *
ОТ Поставщика
ГДЕ CAST(Modified_Date AS DATE) = '2011-05-07'
 

Ссылка: DateTime TransactSQL

Необходимо разрешить компонент времени, потому что 2011-05-07 <> 2011-05-07 12:52:16.830

Либо измените на запрос типа диапазона

 выберите * из Поставщик где
   модифицированная_дата >= '2011-05-07'
   и
   модифицированная_дата < '2011-05-08'
 

...или привести к дате, так как вы используете SQL Server 2008

 выберите * из поставщика, где
   CAST(modified_Date AS date) = '2011-05-07'
 

С точки зрения производительности используйте первый. Или иметь индексированный вычисляемый столбец, который выполняет CAST для вас, и вы фильтруете этот

.