Группировка sql по месяцам в полях дат

Группировка по нескольким столбцам без агрегатных функций

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

Пример 3. Вывести авторов, названия выданных книг, ID пользователя и
инвентарный номер выданной книги.
Сгруппировать по авторам, ID пользователя и инвентарному номеру. На MySQL запрос будет следующим:

SELECT Author, Title, Customer_ID, Inv_no
FROM Bookinuse
GROUP BY Author, Customer_ID, Inv_no

Этот запрос вернёт следующий результат:

Author Title Customer_ID Inv_no
Гоголь Пьесы 47 81
Ильф и Петров Двенадцать стульев 31 3
Маяковский Поэмы 120 2
Пастернак Избранное 18 137
Пастернак Доктор Живаго 120 69
Пушкин Капитанская дочка 47 25
Пушкин Сочинения, т.1 47 6
Пушкин Сочинения, т.2 205 8
Толстой Воскресенье 47 77
Толстой Война и мир 65 28
Толстой Анна Каренина 205 7
Чехов Вишневый сад 31 19
Чехов Ранние рассказы 31 171
Чехов Вишневый сад 65 5
Чехов Избранные рассказы 120 19
Чехов Избранные рассказы 205 4

Как видим, в результирующей таблице присутствуют все книги всех авторов, причём авторы
следуют по порядку, как если бы мы применили оператор ORDER BY. Кроме того, видно, что записи сгруппированы
и по второму указанному столбцу — Customer_ID. Так, у автора Пушкина сначала перечисляются книги, выданные
пользователю с Customer_ID 47, а затем — 205. У автора Чехова сначала перечисляются книги, выданные
пользователю с Customer_ID 31, а затем — с другими номерами. Третий столбец, по которому происходит группировка — Inv_no —
добавлен только для того, чтобы в результирующей таблице выводились все строки, соответствующие значениям
ранее перечисленных столбцов для группировки, а не только уникальные.

По-другому ведёт себя
оператор GROUP BY в MS SQL Server
и в случае этого запроса.

Примеры

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

Обратите внимание: разбор строкового представления дат с помощью конструктора  (так же как эквивалентный ему метод ) может иметь различия и несоответствия в браузерах. Для того, чтобы создать и получить даты между 0 и 99 годом, нужно использовать методы и

Для того, чтобы создать и получить даты между 0 и 99 годом, нужно использовать методы и .

Следующие примеры показывают, как определить разницу во времени между двумя датами в JavaScript:

Обратите внимание: в браузерах, поддерживающих высокое временное разрешение с помощью API замера производительности, метод может обеспечить более надёжные и точные замеры затраченного времени, нежели метод

В этом случае важно возвращать только целое число (так что простое деление не подойдёт), а также возвращать только фактически прошедшие секунды (поэтому этот код использует а не )

В этом случае важно возвращать только целое число (так что простое деление не подойдёт), а также возвращать только фактически прошедшие секунды (поэтому этот код использует а не )

Аргументы

datepart
Компонент даты date, к которому добавляет целое число. В приведенной ниже таблице перечислены все допустимые аргументы datepart.

Примечание

не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.

datepart Сокращения
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

number
Выражение, которое разрешается в тип int, добавляемый к компоненту datepart даты date. принимает определяемые пользователем значения переменных для number. усечет указанное значение number, имеющее десятичную дробь. В этой ситуации значение number не округляется.

date
Выражение, которое может быть разрешено в одно из следующих значений.

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

Для date будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Значение строкового литерала должно разрешаться в datetime. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.

Аргументы

datepart
Определенная часть аргумента date, которую вернет функция . В приведенной ниже таблице перечислены все допустимые аргументы datepart.

Примечание

не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.

datepart Сокращения
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns
TZoffset tz
ISO_WEEK ISOWK, ISOWW

date

Выражение, которое может быть разрешено в один из следующих типов данных:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

Для date будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.

Возвращаемые значения дат с типом данных smalldatetime и частью даты в виде секунд или долей секунды.

Значение секунд даты типа smalldatetime всегда равно 00. Для значения date типа smalldatetime действуют указанные ниже условия.

  • Для части даты datepart секунды second и значения number в диапазоне от –30 до +29 не вносит никаких изменений.
  • Для части даты datepart секунды second и значения number меньше –30 или больше +29 выполняет добавление, начиная с одной минуты.
  • Для части даты datepart миллисекунды millisecond и значения number в диапазоне от –30 001 до + 29 998 не вносит никаких изменений.
  • Для части даты datepart миллисекунды millisecond и значения number меньше –30 001 или больше +29 998 выполняет добавление, начиная с одной минуты.

SQL Учебник

SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии

1. Создание групп (GROUP BY)

Группы создаются с помощью предложения GROUP BY оператора SELECT. Рассмотрим на примере.

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product

Данным запросом мы извлекли информацию о количестве реализованной продукции в каждом месяце. Оператор SELECT приказывает вывести два столбца Product — название продукта и Product_num — расчетное поле, которое мы создали для отображения количества реализованной продукции (формула поля SUM (Quantity)). Предложение GROUP BY указывает СУБД сгруппировать данные по столбцу Product. Стоит также отметить, что GROUP BY должен идти после предложения WHERE и перед ORDER BY.

Detailed Description

A QDate object represents a particular day, regardless of calendar, locale or other settings used when creating it or supplied by the system. It can report the year, month and day of the month that represent the day with respect to the proleptic Gregorian calendar or any calendar supplied as a QCalendar object.

A QDate object is typically created by giving the year, month, and day numbers explicitly. Note that QDate interprets year numbers less than 100 as presented, i.e., as years 1 through 99, without adding any offset. The static function () creates a QDate object containing the date read from the system clock. An explicit date can also be set using (). The () function returns a QDate given a string and a date format which is used to interpret the date within the string.

The (), (), and () functions provide access to the year, month, and day numbers. When more than one of these values is needed, it is more efficient to call (), to save repeating (potentially expensive) calendrical calculations.

Also, () and () functions are provided. The same information is provided in textual format by (). QLocale can map the day numbers to names, QCalendar can map month numbers to names.

QDate provides a full set of operators to compare two QDate objects where smaller means earlier, and larger means later.

You can increment (or decrement) a date by a given number of days using (). Similarly you can use () and (). The () function returns the number of days between two dates.

The () and () functions return how many days there are in this date’s month and year, respectively. The () function indicates whether a date is in a leap year. QCalendar can also supply this information, in some cases more conveniently.

No Year 0

In the Gregorian calendar, there is no year 0. Dates in that year are considered invalid. The year -1 is the year «1 before Christ» or «1 before common era.» The day before 1 January 1 CE, QDate(1, 1, 1), is 31 December 1 BCE, QDate(-1, 12, 31). Various other calendars behave similarly; see ().

Range of Valid Dates

Dates are stored internally as a Julian Day number, an integer count of every day in a contiguous range, with 24 November 4714 BCE in the Gregorian calendar being Julian Day 0 (1 January 4713 BCE in the Julian calendar). As well as being an efficient and accurate way of storing an absolute date, it is suitable for converting a date into other calendar systems such as Hebrew, Islamic or Chinese. The Julian Day number can be obtained using () and can be set using ().

Возвращается значение по умолчанию для аргумента функции datepart, который отличен от даты

Если тип данных аргумента date не содержит указанной части datepart, функция вернет значение по умолчанию для этой части datepart, только если аргумент date содержит литерал.

Например, значение «год-месяц-день» по умолчанию для любого типа данных date равно 1900-01-01. Приведенная ниже инструкция содержит аргументы компонентов даты для datepart, аргумент времени для date, а функция возвращает .

Если аргумент date указан как переменная или столбец таблицы и тип данных этой переменной или столбца не содержит указанной части datepart, функция возвращает ошибку 9810. В этом примере переменная @t имеет тип данных time. Этот пример завершается ошибкой, потому что год даты не является допустимым для типа данных time:

Точность в долях секунды

не допускает использование при сложении в качестве аргумента datepart значений microsecond или nanosecond для типов данных date: smalldatetime, date и datetime.

Миллисекунды имеют точность 3 знака (0,123), микросекунды — 6 знаков (0,123456), наносекунды — 9 знаков (0,123456789). Типы данных time, datetime2 и datetimeoffset имеют максимальную точность 7 знаков (0,1234567). Если аргументом datepart является nanosecond, аргумент number должен иметь значение 100 перед увеличением даты date на доли секунды. number от 1 до 49 округляется до 0, а number от 50 до 99 округляется до 100.

Эти инструкции добавляют часть даты datepart: millisecond, microsecond или nanosecond.

Результирующий набор:

Поддерживаемые форматы строковых литералов для типа данных datetime

В представленных ниже таблицах приводятся поддерживаемые форматы строковых литералов для типа данных datetime. За исключением ODBC, строковые литералы типа datetime заключаются в одинарные кавычки (‘), например ‘string_literaL’. Если язык среды не us_english, строковые литералы должны иметь формат N’string_literaL’.

Числовой Описание
Форматы даты 4/15/96 — (мдг) 4-15-96 — (мдг) 4.15.96 — (мдг) 4/96/15 — (мгд) 15/4/96 — (дмг) 15/96/4 — (дгм) 96/15/4 — (гдм) 96/4/15 — (гмд) Форматы времени 14:30 14:30 14:30 4am 16:00:00 Месяц в датах может указываться в числовом формате. Например, 5/20/97 обозначает двадцатое мая 1997 года. Используя числовой формат дат, указывайте месяц, день и год в виде строки со знаками косой черты (/), дефисами (-) или точками (.) в качестве разделителей. Эта строчка должна выглядеть следующим образом:число разделитель число разделитель число При использовании языковой настройки us_english порядком по умолчанию для даты является mdy (МДГ). Порядок даты можно изменить с помощью инструкции SET DATEFORMAT. Установка для SET DATEFORMAT определяет, как будут интерпретированы значения дат. Если порядок не соответствует конфигурации, значения не обрабатываются как даты. Неупорядоченные даты могут неправильно интерпретироваться как даты за пределами диапазона или даты с неправильными значениями. Например, 12/10/08 может быть интерпретировано как одна из шести различных дат в зависимости от установки DATEFORMAT. Четырехзначный год интерпретируется как год.
Алфавитный формат Описание
Apr 1996 Apr 15 96 Apr 1996 Apr 1996 15 Apr96 15 96 apr 1996 apr 1996 APR 1996 APR Можно указывать дату с полным именем месяца. Например, «апрель» или сокращение «Апр», заданное в текущем языке. Запятые не обязательны, регистр букв не учитывается. Некоторые рекомендации по применению алфавитных форматов даты: 1. Заключайте дату и время в одинарные кавычки (‘). Для всех языков, кроме английского, используйте «N’». 2. Символы, заключенные в квадратные скобки, являются необязательными. 3. Если указать две последние цифры года, значения, меньшие двух последних цифр значения параметра конфигурации сервера two digit year cutoff, будут относиться к столетию года усечения. Значения, большие или равные двум последним цифрам этого параметра, относятся к столетию, предшествующему столетию года усечения. Например, если значение параметра two digit year cutoff равно 2050 (по умолчанию), то год, обозначенный двумя цифрами 25, интерпретируется как 2025, а год, обозначенный двумя цифрами 50, — как 1950. Во избежание неоднозначности используйте четырехзначную запись года. 4. Если не указано число месяца, подразумевается первое число месяца. Параметр сеанса SET DATEFORMAT не применяется, если месяц указывается в алфавитном формате.
ISO 8601 Описание
ГГГГ-ММ-ДДТчч:мм:сс ГГГГММДД] Примеры: 1. 2004-05-23T14:25:10 2. 2004-05-23T14:25:10.487 Чтобы использовать формат ISO 8601, необходимо указать каждый элемент в этом формате, включая T, двоеточие (:) и точку (.), которые отображаются в этом формате. Квадратные скобки показывают, что доли секунд не являются обязательными. Временной компонент указан в 24-часовом формате. Символ T указывает на начало временной части значения datetime. Преимущество формата ISO 8601 заключается в том, что он является международным стандартом с однозначным представлением. Кроме того, на этот формат не влияют настройки SET DATEFORMAT и SET LANGUAGE.
Без разделителей Описание
ГГГГММДД чч:мм:сс
ODBC Описание
{ ts ‘1998-05-02 01:23:56.123’ } { d ‘1990-10-02′ } { t ’13:33:41’ } Интерфейс API ODBC определяет управляющие последовательности, представляющие значения даты и времени, называемые в ODBC метками времени. Этот формат меток времени ODBC также поддерживается определением языка OLE DB (DBGUID-SQL), поддерживаемым поставщиком Microsoft OLE DB для SQL Server. Приложения, использующие ADO, OLE DB или API-интерфейсы, основанные на ODBC, могут использовать этот формат отметок времени ODBC для представления даты и времени. Escape-последовательности меток времени ODBC имеют следующий формат: { literal_type ‘constant_value’ }: — literal_type определяет тип escape-последовательности. Метки времени имеют три описателя literal_type:1) d = только дата2) t = только время3) ts = метка времени (время + дата) — ‘constant_value’ является значением escape-последовательности. Значение constant_value должно соответствовать этим форматам для каждого literal_type.d : гггг-мм-ддt : чч:мм:ссts : гггг-мм-дд чч:мм:сс

Получение даты из другой даты

Чтобы получить дату из другой даты, нужно:

  1. Установить конкретное значение даты/времени из другой даты.
  2. Добавить/вычесть отрезок времени из другой даты.

Установка конкретной даты / времени

Для этого можно использовать следующие методы:

  1. : устанавливает четырехзначный год по местному времени.
  2. : устанавливает месяц года по местному времени.
  3. : устанавливает день месяца по местному времени.
  4. : устанавливает часы по местному времени.
  5. : устанавливает минуты по местному времени.
  6. : устанавливает секунды по местному времени.
  7. : устанавливает миллисекунды по местному времени.

Например, если вы хотите задать дату для 15 числа месяца, вы можете использовать метод .

const d = new Date(2019, 0, 10)
d.setDate(15)
console.log(d) // 15 января 2019

Чтобы установить июнь месяц, примените метод :

const d = new Date(2019, 0, 10)
d.setMonth(5)
console.log(d) // 10 июня 2019

Методы установки значений даты изменяют исходный объект Date(). На практике лучше модифицировать отдельный экземпляр объекта.

const d = new Date(2019, 0, 10)
const newDate = new Date(d)
newDate.setMonth(5)
console.log(d) // 10 января 2019
console.log(newDate) // 10 июня 2019

Добавление/вычитание периода времени из другой даты

Чтобы добавить/вычесть период времени, нужно знать значение текущей даты. Его можно получить с помощью следующих методов:

  1. : возвращает четырехзначный год по местному времени.
  2. : возвращает месяц года (0-11) по местному времени.
  3. : возвращает день месяца (1-31) по местному времени.
  4. : возвращает часы (0-23) по местному времени.
  5. : возвращает минуты (0-59) по местному времени.
  6. : возвращает секунды (0-59) по местному времени.
  7. : возвращает миллисекунды (0-999) по местному времени.

Допустим, что вы хотите назначить свидание через три дня (начиная  с сегодняшнего дня). Предположим, что сегодня 28 марта 2019 года.

Первый подход (установка значения)

// Подразумеваем, что сегодня 28 марта 2019
const today = new Date(2019, 2, 28)

Сначала создаем новый объект Date (чтобы не изменять исходный экземпляр объекта):

const finalDate = new Date(today)

С помощью получаем значение, которое хотим изменить:

const currentDate = today.getDate()

Свидание произойдет через три дня. Поэтому добавляем их к текущей дате:

finalDate.setDate(currentDate + 3)

Полный код для первого подхода:

const today = new Date(2019, 2, 28)
const finalDate = new Date(today)
finalDate.setDate(today.getDate() + 3)
console.log(finalDate) // 31 марта 2019

Второй подход (создание новой даты)

Сначала используем , , и другие методы, пока не получим типа значения, которое мы изменить. Затем мы создаём искомую дату при помощи .

const today = new Date(2019, 2, 28)
// Получение нужных значений
const year = today.getFullYear()
const month = today.getMonh()
const day = today.getDate()
// Создание новой даты
const finalDate = new Date(year, month, day + 3)
console.log(finalDate) // 31 марта 2019

Оба подхода работают.

Метод для преобразования строки в дату

JavaScript для преобразования строки в дату использует метод . Этот метод может преобразовать строку, если она выполнена в соответствии со стандартом RFC2822 или ISO 8601.

В этом уроке рассмотрим стандарт ISO 8601, в котором строка должна иметь следующий формат: .

Где:

  • – год, состоящий из 4 цифр;
  • – месяц, состоящий из 2 цифр (01 = Январь, 02 = Февраль, и т.д.);
  • – день месяца, состоящий из 2 цифр (01..31);
  • – символ для разделения даты и времени;
  • – количество часов (00..23);
  • — количество минут (00..59);
  • — количество секунд (00..59);
  • — количество миллисекунд (0..999);
  • — символ, который означает, что время задаётся в формате UTC. Если Вам необходимо вместо UTC установить часовой пояс, то букву «» следует заменить значением или .

Если строка, содержащая дату и время, задана не в формате RFC2822 или ISO 8601, то метод JavaScript всё равно может выполнить её преобразование, но результат в этом случае могут оказаться непредсказуемым.

Фильтры даты сводной таблицы Excel

Как я могу группировать только по месяцам из поля даты (а не по дням)?

Вот как выглядит мое поле даты:

Вот мой текущий SQL:

Я бы использовал это:

Это будет группироваться до первого числа каждого месяца, поэтому

дам . Я обычно предпочитаю этот метод, поскольку он сохраняет даты как даты.

В качестве альтернативы вы можете использовать что-то вроде этого:

Это действительно зависит от вашего желаемого результата. (Год закрытия не является обязательным в вашем примере, но если диапазон дат пересекает границу года, это может быть).

  • GarethD, спасибо, оба метода работали нормально. Есть ли способ сгруппировать год и месяц в одном поле? Значение отображается в таком формате: Dec-12 (Dec — месяц, а 12 — год). Благодарность
  • Первый способ сделает это, вам просто нужно отформатировать столбец. Я бы посоветовал сделать это вне SQL, но если это нужно сделать как таковое, вы можете использовать что-то вроде
  • @GarethD Не могли бы вы объяснить, как вы просто использовали dateiff между 0 и date. 0 это не свидание.
  • 1, а также что Closing_Date = DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0) делает, почему не просто DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0)
  • 3 @irfandar 0 не является датой, но SQL-Server неявно преобразует ее в 1 января 1900 года. По вашему второму вопросу это просто псевдоним столбца, это то же самое, что и наличие после выражения. Это полностью субъективно, но лично я считаю обозначения намного легче читать, чем . Подробнее о том, почему я предпочитаю его, читайте в статье Аарона Бертрана.

Используйте функцию DATEPART, чтобы извлечь месяц из числа.

Итак, вы бы сделали что-то вроде этого:

  • 14 Для Mysql вы можете использовать MONTH () или MONTHNAME () вместо DATEPART
  • Если вы часто выполняете этот запрос, подумайте о создании соответствующего индекса.
  • Плюс 1 за простой ответ.
  • 9 При этом месяцы разных лет будут рассматриваться одинаково, что обычно НЕ является ожидаемым.
  • Это ставит «1» для января и т. Д. Это не говорит вам название месяца.

Для этого я использовал функцию FORMAT:

Добавлением в .

Функция DATEPART не работает в MySQL 5.6, вместо этого используйте MONTH (‘2018-01-01’)

Попробуй это:

Таким образом, вы группируете по объединенному формату даты, к которому присоединяется —

Версия SQL Server 2012 выше,

Вы можете сделать это с помощью Year (), Month () Day () и datepart ().

В вашем примере это будет:

  • Это недопустимый SQL
  • Что ж, это действительно так, но дает непредсказуемые результаты, поскольку вы не группируете по выбранным полям. Вы можете иметь любое значение в дате закрытия, если дата и год совпадают.

Попробуйте следующий код

Точность в долях секунды

не допускает использование при сложении в качестве аргумента datepart значений microsecond или nanosecond для типов данных date: smalldatetime, date и datetime.

Миллисекунды имеют точность 3 знака (0,123), микросекунды — 6 знаков (0,123456), наносекунды — 9 знаков (0,123456789). Типы данных time, datetime2 и datetimeoffset имеют максимальную точность 7 знаков (0,1234567). Если аргументом datepart является nanosecond, аргумент number должен иметь значение 100 перед увеличением даты date на доли секунды. number от 1 до 49 округляется до 0, а number от 50 до 99 округляется до 100.

Эти инструкции добавляют часть даты datepart: millisecond, microsecond или nanosecond.

Результирующий набор:

Группировка с агрегатными функциями

Агрегатные функции COUNT, SUM, AVG, MAX, MIN служат для вычисления соответствующего агрегатного значения ко всему
набору строк, для которых некоторый столбец — общий.

Пример 4. Вывести количество выданных книг каждого автора. Запрос будет следующим:

SELECT Author, COUNT(*) AS InUse
FROM Bookinuse
GROUP BY Author

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

Author InUse
NULL 1
Гоголь 1
Ильф и Петров 1
Маяковский 1
Пастернак 2
Пушкин 3
Толстой 3
Чехов 5

Пример 5. Вывести количество книг, выданных каждому пользователю. Запрос будет следующим:

SELECT Customer_ID, COUNT(*) AS InUse
FROM Bookinuse
GROUP BY Customer_ID

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

User_ID InUse
18 1
31 3
47 4
65 2
120 3
205 3

Примеры запросов к базе данных «Библиотека» есть также в уроках по оператору IN,
предикату EXISTS и функциям
CONCAT, COALESCE.

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

Поделиться с друзьями

Назад Листать Вперёд>>>
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: