#sql #sql-server
#sql #sql-сервер
Вопрос:
Дата начала: 14.10.2016 Дата окончания: Statdate — 4 недели
Мне нужен один запрос, который выполняет эту последовательность в SQL
SELECT COUNT(*) FROM TableName
WHERE AddDate between '10/14/2016 10:16:00' and '10/14/2016 10:31:00'
SELECT COUNT(*) FROM TableName
WHERE AddDate between '10/07/2016 10:16:00' and '10/07/2016 10:31:00'
SELECT COUNT(*) FROM TableName
WHERE AddDate between '09/30/2016 10:16:00' and '09/30/2016 10:31:00'
SELECT COUNT(*) FROM TableName
WHERE AddDate between '09/23/2016 10:16:00' and '09/23/2016 10:31:00'
Я был бы признателен, если кто-нибудь поможет в этом.
Ответ №1:
Как насчет чего-то подобного (для MySQL, но подобное существует для других баз данных)
SELECT
DATE(AddDate) as TheDate,
COUNT(*) as Records
FROM TableName
WHERE
AddDate BETWEEN '2016-23-09' AND '2016-10-15'
AND DAYOFWEEK(AddDate) = 1 //for SUNDAYS
AND TIME(AddDate) BETWEEN '10:16:00' AND '10:31:00'
GROUP BY DATE(AddDate)
ORDER BY DATE(AddDate) ASC
Я не тестировал это, но это должно дать вам что-то вроде:
TheDates Records
--------------------
2016-09-23 120
2016-09-30 157
...etc
Комментарии:
1. Вам нужно будет использовать DATEPART , если вы используете SQL Server, вместо функций даты и времени, которые я использовал в своем примере.
2. SQL Server 2008 и выше:
3. Я изменил инструкцию для поддержки SQL Server
4. ВЫБЕРИТЕ CONVERT(Date, AddDate) в качестве даты, COUNT(*) как записи ИЗ TableName С (NOLOCK), ГДЕ CONVERT(Date, AddDate) МЕЖДУ ‘23.09.2016’ И ‘23.10.2016’ И DATEPART(dw, AddDate)= 6 И CONVERT(Time, AddDate) МЕЖДУ ’10:16:00′ И ’10:31:00′ ГРУППИРОВАТЬ ПО ПРЕОБРАЗОВАНИЮ (дата, дата добавления) УПОРЯДОЧИВАТЬ ПО ПРЕОБРАЗОВАНИЮ (дата, дата добавления) ASC
Ответ №2:
Разве вы не можете просто использовать UNION, чтобы собрать их все вместе? Или вы просите что-то еще?
SELECT COUNT(*) FROM TableName
WHERE AddDate between '10/14/2016 10:16:00' and '10/14/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
WHERE AddDate between '10/07/2016 10:16:00' and '10/07/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
WHERE AddDate between '09/30/2016 10:16:00' and '09/30/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
WHERE AddDate between '09/23/2016 10:16:00' and '09/23/2016 10:31:00'
Ответ №3:
Используйте Group by
SELECT
LEFT(DATENAME(wk,AddDate),2) as WeekNumber ,
COUNT(*) as Count
FROM TableName
WHERE AddDate between '09/23/2016 10:16:00' and '10/14/2016 10:31:00'
GROUP BY LEFT(DATENAME(wk,AddDate),2)
Комментарии:
1. Это возвращает данные за всю неделю.
2. Да, это дает количество каждой недели, в какую сторону вы хотите выводить
Ответ №4:
Вот один из способов использования CASE
инструкции
SELECT ranges,count(*)
FROM (SELECT CASE
WHEN AddDate BETWEEN '10/14/2016 10:16:00' AND '10/14/2016 10:31:00' THEN '10/14/2016 10:16:00 - 10/14/2016 10:31:00'
WHEN AddDate BETWEEN '10/07/2016 10:16:00' AND '10/07/2016 10:31:00' THEN '10/07/2016 10:16:00 - 10/07/2016 10:31:00'
WHEN AddDate BETWEEN '09/30/2016 10:16:00' AND '09/30/2016 10:31:00' THEN '09/30/2016 10:16:00 - 09/30/2016 10:31:00'
WHEN AddDate BETWEEN '09/23/2016 10:16:00' AND '09/23/2016 10:31:00' THEN '09/23/2016 10:16:00 - 09/23/2016 10:31:00'
END AS ranges
FROM yourtable) a
GROUP BY ranges