Как в sql сделать выборку по дате
Перейти к содержимому

Как в sql сделать выборку по дате

  • автор:

Выборка по дате

Интересует такой вопрос. Как сделать выборку данных по дате?
на пример что было неделю назад если отталкиваться от сегодня
что было в прошлом месяце (т.е. например сегодня февраль, а надо узнать что было в январе)
и что происходило в этом месяце (с начала по сегодняшнее число)

ну или просто где это почитать?

да, гугл забанил)

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Выборка по дате
Есть 2 столбца: Номер телефона, Дата разговора. Необходимо вывести абонентов, которые не.

Выборка по дате
Подскажите кто-нибудь, как правильно написать запрос? требуется вывести записи с критерием по дате.

Выборка по дате и времени
SELECT dbo.TestCS.idTestCS, dbo.TestCS.NoOrder, dbo.Customer.Name as Customer.

Выборка по дате, не затрагивая время
Здравствуйте! Такой вопрос: в таблице есть поле типа smalldatetime. Мне нужно сделать выборку по.

1634 / 1135 / 171
Регистрация: 23.07.2010
Сообщений: 6,713
1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264
Что было в январе?

WHERE DateField >= '20180101' AND DateField  '20180201'

Главное — стараться накладывать ограничение на поле, а не на функцию от поля. Иначе нельзя будет использовать индекс.

1634 / 1135 / 171
Регистрация: 23.07.2010
Сообщений: 6,713
Так datediff детерминированная же. В чем подвох с использованием индексов?
Регистрация: 27.11.2014
Сообщений: 263
iap, искал по вашему примеру то что было только в феврале
результат — ничего

1 2 3 4 5 6 7 8
SELECT Dohod.UsersID ,SUM(Dohod.KolichestvoSredstv) AS expr1 FROM dbo.Dohod WHERE Dohod.UsersID = 1 AND Dohod.Var_Scheta = 1 AND Dohod.Date ! 01022018 GROUP BY Dohod.UsersID

1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621

ЦитатаСообщение от 19boom96 Посмотреть сообщение

искал по вашему примеру то что было только в феврале
результат — ничего
SQLВыделить код
1
2
3
4
5
6
7
8
SELECT
* Dohod.UsersID
*,SUM(Dohod.KolichestvoSredstv) AS expr1
FROM dbo.Dohod
WHERE Dohod.UsersID = 1
AND Dohod.Var_Scheta = 1
AND Dohod.Date ! < 01022018
GROUP BY Dohod.UsersID

Целое число 01022018 конвертируется в дату ‘11.03.4698’. В вашей таблице есть данные, которые не меньше этой даты? Дату писать нужно так ‘20180201’. Ну или так ‘01.02.2018’

ЦитатаСообщение от pincet Посмотреть сообщение

Так datediff детерминированная же. В чем подвох с использованием индексов?
В том, что при такой записи:

1 2 3
SELECT * FROM MyTable WHERE DATEDIFF(MONTH, CURRENT_TIMESTAMP, MyDate) = -1

Будет происходит полное сканирование индекса, так как для проверки условия нужно вычислить значение функции DATEDIFF для каждого значения MyDate в таблице.
А при такой записи:

1 2 3 4
SELECT * FROM MyTable WHERE MyDate >= DATEADD(MONTH, -1, CONVERT(DATETIME, CONVERT(CHAR(6), CURRENT_TIMESTAMP, 112) + '01')) AND MyDate  CONVERT(DATETIME, CONVERT(CHAR(6), CURRENT_TIMESTAMP, 112) + '01')

Будет происходить поиск в индексе.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Выборка по дате из поля DateTime
Здравствуйте. Есть таблица с полем DateTime. Мне необходимо получить количество записей в которых.

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

Выборка по заданной дате и времени
Здравствуйте, уважаемые форумчане. Помогите, пожалуйста, решить задачу: Есть таблица со столбцом.

Выборка по дате
Добрый день! Для того, что бы выбрать необходимую мне дату пишу условие "where date =.

Выборка по дате
Как сделать выборку: | | Отчетный | Отчетный | Тип | Дата | | № | .

Выборка по дате
Здравствуйте! Есть итоговая таблица: номер1 25.10.2016 11:36:10 номер2 25.10.2016 15:14:32 .

выборка актуальных по дате данных

Имеется табличка, в которой тип группы меняется с течением времени:

select * from user_groups_by_types ; id | change_date | user_group | group_type ----+-------------+------------+------------ 1 | 2022-05-01 | A | type1 2 | 2022-05-05 | A | type2 3 | 2022-05-06 | B | type1 

Требуется выбрать для каждой группы актуальный тип (т.е. самый последний по дате тип). Решение для одной конкретной группы очевидно. Как это обобщить на все группы?

select * from user_groups_by_types where user_group = 'A' and change_date = (select max(change_date) from user_groups_by_types where user_group = 'A'); id | change_date | user_group | group_type ----+-------------+------------+------------ 2 | 2022-05-05 | A | type2 

scisearcher
30.05.22 13:18:41 MSK

  • Ответить на это сообщение
  • Ссылка

select distinct on (user_group) * from user_groups_by_types order by user_group, change_date desc; 

theNamelessOne ★★★★★
( 30.05.22 13:48:55 MSK )
Последнее исправление: theNamelessOne 30.05.22 13:49:09 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

У вас структура говна, ибо из конкретной записи не возможно узнать дату когда тип станет неактуальным.
По-нормальному делаются 2 даты — начальная и конечная. В таком случае всё выбирается банальным between, да и вообще, это удобнее в большинстве других кейсов.

crutch_master ★★★★★
( 30.05.22 17:32:10 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от crutch_master 30.05.22 17:32:10 MSK

структура мне дана и менять ее нельзя, к сожалению

scisearcher
( 30.05.22 17:53:59 MSK ) автор топика

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

Ответ на: комментарий от theNamelessOne 30.05.22 13:48:55 MSK
scisearcher
( 30.05.22 17:54:45 MSK ) автор топика

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от scisearcher 30.05.22 17:53:59 MSK

структура мне дана и менять ее нельзя, к сожалению

Печально. Но если было бы можно приделать таблицу сбоку я бы приделал. А так изъёжам не будет конца.

crutch_master ★★★★★
( 30.05.22 17:55:39 MSK )
Последнее исправление: crutch_master 30.05.22 17:56:56 MSK (всего исправлений: 2)

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от scisearcher 30.05.22 17:53:59 MSK

Значит надо приводить к нормальному виду и добавлять недостающие данные заджоинив таблицу саму с собой по следующей-предыдущей записи, что то еще удовольствие.
Хотя в конкретном случае можно просто приджоинить

select max(change_date) from user_groups_by_types group by user_group 

по этой самой user_group и стравнить по change_date.

crutch_master ★★★★★
( 30.05.22 17:58:33 MSK )
Последнее исправление: crutch_master 30.05.22 18:01:20 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от crutch_master 30.05.22 17:58:33 MSK

Спасибо за идею. Кстати, можно проще. Добавить столбец is_active и при назначении нового типа заполнять этот столбец в 1-й или 2-х записях. Хотя start_date и end_date более универсально. Но, править БД незя, c distinct group by выкрутился )

scisearcher
( 30.05.22 18:16:18 MSK ) автор топика

  • Ответить на это сообщение
  • Ссылка

21 октября 2022 г.

Во-первых решение для одной группы есть и лучше — без подзапроса:

SELECT * FROM user_groups_by_types WHERE user_group='A' ORDER BY change_date DESC LIMIT 1

Во-вторых для всех групп оно тоже очевидное, но не слишком быстрое и читаемое (которое предложил crutch_master ):

SELECT t1.id, t1.change_date, t1.user_group, t1.group_type FROM user_groups_by_types t1 INNER JOIN (SELECT MAX(change_date) AS max_date, user_group FROM user_groups_by_types GROUP BY user_group) t2 ON t1.change_date=t2.max_date AND t1.user_group=t2.user_group

Чтобы сделать хорошо, можно сделать так (но для этого придется поменять структуру):

Добавить в таблицу булев столбец is_current
SELECT * FROM user_groups_by_types WHERE is_current=TRUE

Вообще это гуглится slowly changing dimension.
damix9 ★★★
( 21.10.22 00:01:47 MSK )

  • Ответить на это сообщение
  • Ссылка

SQL выборка по дате?

5d039dd848394517418933.png

Выводит:

Но вот вопрос, можно, что бы sql подставил сам даты, которых не хватает, то есть
2018-12-14
2018-12-15
2018-12-16
и до
2018-12-23

Или нужно ему подставить даты

SELECT * FROM `table_user` WHERE U_ID = 2 and date_format(DATE_CREATE, '%Y%m') in ('2018-12-23','2018-12-22' и тд)

ТО есть, подставить я и сам могу, вопрос может ли это сделать mySQL?

  • Вопрос задан более трёх лет назад
  • 4535 просмотров

Как сделать sql select по дате?

Не сработало.
Как можно сделать селект по дате?

  • Вопрос задан более трёх лет назад
  • 6879 просмотров

Комментировать
Решения вопроса 1

tsklab

Константин Цветков @tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.

SELECT COUNT(*) FROM [Table] WHERE CAST( UpdateDate AS DATE) = '20200606'

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *