Содержание

Как из даты получить год, месяц или день в T-SQL? Microsoft SQL Server | Info-Comp.ru

Привет, сегодня я покажу, как в T-SQL из даты можно получить определенную часть этой даты, например, год, месяц, день и даже час, иными словами, в данном материале мы ответим на несколько вопросов, которые связаны с извлечением данных из значения, содержащего дату.

Содержание

  1. Как в T-SQL получить текущую дату?
  2. Пример – получение текущей даты в Microsoft SQL Server
  3. Как получить год из даты в T-SQL?
  4. Пример – получаем год из даты в Microsoft SQL Server
  5. Как получить месяц из даты в T-SQL?
  6. Пример – получаем месяц из даты в Microsoft SQL Server
  7. Как из даты получить день в T-SQL?
  8. Пример – получаем день из даты в Microsoft SQL Server
  9. Как из даты получить час в T-SQL?
  10. Пример – получаем час из даты в Microsoft SQL Server

Как в T-SQL получить текущую дату?

Для начала давайте я расскажу о том, как в Microsoft SQL Server можно получить значение текущей даты.

Для получения текущей даты в Microsoft SQL Server существует несколько специальных системных функций. Давайте некоторые из этих функций рассмотрим.

  • GETDATE – функция возвращает значение, которое содержит дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, при этом смещение часового пояса не включается. Лично мне достаточно часто приходится пользоваться именно этой функцией;
  • CURRENT_TIMESTAMP – эта функция эквивалентна функции GETDATE, она возвращает точно такое же значение. Вы можете использовать любую функцию, но как я уже сказал, лично я отдаю предпочтение функции GETDATE;
  • SYSDATETIME – данная функция также возвращает дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, смещение часового пояса тоже не включается. Но в данном случае функция возвращает значение с более высокой точностью в долях секунды.

Примечание! Для того чтобы получить значение даты и времени с учетом смещения часового пояса, необходимо использовать функцию SYSDATETIMEOFFSET, а для того чтобы получить значение даты и времени в формате UTC функции GETUTCDATE или SYSUTCDATETIME.

Заметка! Начинающим рекомендую посмотреть мой видеокурс по T-SQL.

Пример – получение текущей даты в Microsoft SQL Server

В данном примере мы вызовем три функции получения текущей даты.

   
   SELECT GETDATE() AS [GETDATE],
           CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP],
           SYSDATETIME() AS [SYSDATETIME]


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

Как получить год из даты в T-SQL?

Если у Вас возникла необходимость из даты получить год, то есть, например, из 01.01.2019 получить 2019 в виде отдельного значения или просто из текущей даты получить год, то в Microsoft SQL Server Вы это можете сделать несколькими способами.

Первый способ заключается в использовании специальной функции YEAR, которая как раз и делает ровно то, что нам нужно, иными словами, она возвращает целое число, представляющее год даты, указанной во входном параметре.

Второй способ предполагает использование другой функции T-SQL – это DATEPART, которая возвращает целое число, представляющее указанную часть даты.

DATEPART принимает два параметра: первый, datepart, т.е. какую часть даты нам нужно вернуть, второй, дата, которую необходимо обработать.

Пример – получаем год из даты в Microsoft SQL Server

В данном примере я покажу различные вариации передачи параметра DATE в указанные выше функции, так как его можно передать и в виде переменной, и в виде выражения, и в виде функции. Сразу скажу, что эти способы передачи параметра можно использовать и в других функциях, которые сегодня мы будем рассматривать.

Чтобы DATEPART нам вернула год из даты, первым параметром нам необходимо передать значение, характеризующее часть

«год», допустимо передавать следующие значения: year, yyyy или yy.

   
   --Объявляем переменную для хранения даты
   DECLARE @TestDate DATETIME
   --Присваиваем значение переменной (текущая дата)
   SET @TestDate = GETDATE()

   --Запрос SELECT
   SELECT @TestDate AS [Дата],
           
           --Передаем переменную в качестве параметра
           YEAR(@TestDate) AS [Год YEAR],
           DATEPART(YY, @TestDate) AS [Год DATEPART],
           
           --Передаем выражение, приводящее к типу DATE
           YEAR('01.
01.2019') AS [Год YEAR], --В качестве параметра указываем функцию DATEPART(YY, GETDATE()) AS [Год DATEPART]

Как получить месяц из даты в T-SQL?

В T-SQL из даты можно получить и номер месяца, для этого можно использовать функцию MONTH, она возвращает целое число, представляющее месяц указанной даты или все ту же функцию DATEPART, в которую, в данном случае необходимо будет передать значение, характеризующее часть даты «месяц», можно использовать: month, mm или m.

Пример – получаем месяц из даты в Microsoft SQL Server

В этом примере мы получаем месяц из даты снова несколькими способами.

   
   --Объявляем переменную для хранения даты
   DECLARE @TestDate DATETIME
   --Присваиваем значение переменной (текущая дата)
   SET @TestDate = GETDATE()

   --Запрос SELECT
   SELECT @TestDate AS [Дата],
           
           --Передаем переменную в качестве параметра
           MONTH(@TestDate) AS [Месяц MONTH],
           DATEPART(MM, @TestDate) AS [Месяц DATEPART],
           
           --Передаем выражение, приводящее к типу DATE
           MONTH('01.
01.2019') AS [Месяц MONTH], --В качестве параметра указываем функцию DATEPART(MM, GETDATE()) AS [Месяц DATEPART]

Как из даты получить день в T-SQL?

Для того чтобы получить из даты день, в T-SQL можно использовать функцию DAY – это функция возвращает целое число, представляющее день указанной даты. Также можно использовать и уже знакомую функцию DATEPART со значением первого параметра: day, dd или d.

Пример – получаем день из даты в Microsoft SQL Server

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

   
   --Объявляем переменную для хранения даты
   DECLARE @TestDate DATETIME
   --Присваиваем значение переменной (текущая дата)
   SET @TestDate = GETDATE()

   --Запрос SELECT
   SELECT @TestDate AS [Дата],
           
           --Передаем переменную в качестве параметра
           DAY(@TestDate) AS [День DAY],
           DATEPART(DD, @TestDate) AS [День DATEPART],
           
           --Передаем выражение, приводящее к типу DATE
           DAY('01.
01.2019') AS [День DAY], --В качестве параметра указываем функцию DATEPART(DD, GETDATE()) AS [День DATEPART]

Как из даты получить час в T-SQL?

Чтобы из даты получить час, мы можем использовать функцию DATEPART со значением hour или hh. Только в данном случае второй параметр (date), в котором мы передаем значение даты, должен обязательно содержать время, т.е. иметь тип данных DATETIME, тип DATE не допускается.

Пример – получаем час из даты в Microsoft SQL Server

В этом примере мы из даты получаем час.

   
   --Объявляем переменную для хранения даты
   DECLARE @TestDate DATETIME
   --Присваиваем значение переменной (текущая дата)
   SET @TestDate = GETDATE()

   --Запрос SELECT
   SELECT @TestDate AS [Дата],
           
           --Передаем переменную в качестве параметра
           DATEPART(HH, @TestDate) AS [Час],
          
           --В качестве параметра указываем функцию
           DATEPART(HH, GETDATE()) AS [Час]


У меня все, надеюсь, перечисленные выше примеры помогут Вам в решении Ваших задач. Начинающим программистам рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы

«с нуля» научитесь работать с SQL и программировать на T-SQL в Microsoft SQL Server.

Пока!

Как выделить месяц из даты sql

MS SQL user function, procedures – Пользовательские функции и процедуры MS SQL.

Очень часто бывает необходимо в аналитических процедурах в MS SQL Server’e “вытащить” первое число месяца. Например, в отчетах месяц можно отображать как первое число этого месяца, что весьма удобно с точки зрения сортировки данных в сводной таблице MS Excel.

В t-SQL можно поступить таким образом:

Здесь с помощью встроенной функции dateadd от переменной @d вычитается количество дней равное дате в исходном месяце (получается последняя дата предыдущего месяца) и прибавляется один день, чтобы получить первое число исходного месяца. Для того, чтобы избавиться от “лишнего” времени применяем функцию convert, где преобразуем переменную @d к типу date (только дата без времени).

Можно даже написать функцию, которая принимает в качестве параметра дату

Пример использования функции:

ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server База данных SQL Azure Azure Synapse Analytics (хранилище данных SQL) Parallel Data Warehouse APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse

Эта функция возвращает целое число, представляющее указанную часть datepart заданного типа date. This function returns an integer representing the specified datepart of the specified date.

Обзор всех типов данных и функций даты и времени в языке Transact-SQL Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL). See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQL Transact-SQL date and time data types and functions.

Синтаксические обозначения в Transact-SQL Transact-SQL Syntax Conventions

Синтаксис Syntax

Аргументы Arguments

datepart datepart
Определенная часть аргумента date, для которого функция DATEPART вернет значение типа integer. The specific part of the date argument for which DATEPART will return an integer. В приведенной ниже таблице перечислены все допустимые аргументы datepart. This table lists all valid datepart arguments.

DATEPART не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart. DATEPART does not accept user-defined variable equivalents for the datepart arguments.

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

date date
Выражение, которое разрешается в один из следующих типов данных: An expression that resolves to one of the following data types:

  • datedate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

Для date DATEPART будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. For date, DATEPART will accept a column expression, expression, string literal, or user-defined variable. Во избежание неоднозначности используйте четырехзначную запись года. Use four-digit years to avoid ambiguity issues. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff. See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

Тип возвращаемых данных Return Type

int int

Возвращаемое значение Return Value

Каждое выражение datepart и его краткие формы возвращают одно и то же значение. Each datepart and its abbreviations return the same value.

Возвращаемое значение зависит от языка среды, задаваемого инструкцией SET LANGUAGE, и от параметра конфигурации сервера «язык по умолчанию» для имени входа. The return value depends on the language environment set by using SET LANGUAGE, and by the Configure the default language Server Configuration Option of the login. Если значение date является строковым литералом некоторого формата, то возвращаемое значение зависит от функции SET DATEFORMAT. The return value depends on SET DATEFORMAT if date is a string literal of some formats. Инструкция SET DATEFORMAT не изменяет возвращаемое значение, если дата представляется выражением столбца типа данных даты или времени. SET DATEFORMAT does not change the return value when the date is a column expression of a date or time data type.

Ниже представлена таблица соответствия аргументов функции datepart и значений, возвращенных выражением SELECT DATEPART(datepart,’2007-10-30 12:15:32.1234567 +05:10′) . This table lists all datepart arguments, with corresponding return values, for the statement SELECT DATEPART(datepart,’2007-10-30 12:15:32.1234567 +05:10′) . Аргумент date имеет тип данных datetimeoffset(7) . The date argument has a datetimeoffset(7) data type. Последние две позиции значения, возвращаемого функцией nanosecond datepart, всегда 00 . Масштаб этого значения составляет 9. The last two positions of the nanosecond datepart return value are always 00 and this value has a scale of 9:

.123456700 .123456700

datepart datepart Возвращаемое значение Return value
year, yyyy, yy year, yyyy, yy 2007 г. 2007
quarter, qq, q quarter, qq, q 4 4
month, mm, m month, mm, m 10 10
dayofyear, dy, y dayofyear, dy, y 303 303
day, dd, d day, dd, d 30 30
week, wk, ww week, wk, ww 44 44
weekday, dw weekday, dw 3 3
hour, hh hour, hh 12 12
minute, n minute, n 15 15
second, ss, s second, ss, s 32 32
millisecond, ms millisecond, ms 123 123
microsecond, mcs microsecond, mcs 123456 123456
nanosecond, ns nanosecond, ns 123456700 123456700
tzoffset, tz tzoffset, tz 310 310
iso_week, isowk, isoww iso_week, isowk, isoww 44 44

Аргументы функции datepart, содержащие информацию о номере недели и дня Week and weekday datepart arguments

Для week (wk, ww) или weekday (dw) datepart возвращаемое значение DATEPART зависит от значения, заданного функцией SET DATEFIRST. For a week (wk, ww) or weekday (dw) datepart, the DATEPART return value depends on the value set by SET DATEFIRST.

1 января любого года определяет начальное число для компонента даты week datepart. January 1 of any year defines the starting number for the week datepart. Пример: For example:

DATEPART (wk, ‘Jan 1, xxxx’) = 1, DATEPART (wk, ‘Jan 1, xxxx’) = 1

где xxxx — любой год. where xxxx is any year.

В этой таблице представлены возвращаемые значения параметров week и weekday datepart для даты 21.04.2007 с каждым аргументом функции SET DATEFIRST. This table shows the return value for the week and weekday datepart for ‘2007-04-21 ‘ for each SET DATEFIRST argument. 1 января 2007 г. приходится на понедельник. January 1, 2007 falls on a Monday. 21 апреля 2007 г. приходится на субботу. April 21, 2007 falls on a Saturday. Для региональных настроек «Английский (США)» For U.S. English,

SET DATEFIRST 7 — ( Sunday )

SET DATEFIRST 7 (воскресенье). serves as the default. После задания DATEFIRST используйте предлагаемую инструкцию SQL для табличных значений datepart: After setting DATEFIRST, use this suggested SQL statement for the datepart table values:

SELECT DATEPART(week, ‘2007-04-21 ‘), DATEPART(weekday, ‘2007-04-21 ‘)

SET DATEFIRST SET DATEFIRST
1 1 16 16 6 6 2 2 17 17 5 5 3 3 17 17 4 4 4 4 17 17 3 3 5 5 17 17 2 2 6 6 17 17 1 1 7 7 16 16 7 7

Аргументы функции datepart, отображающие год, месяц и день даты year, month, and day datepart Arguments

Значения, возвращаемые в результате выполнения инструкций DATEPART (year, date), DATEPART (month, date) и DATEPART (day, date), совпадают с результатами выполнения функций YEAR, MONTH и DAY, соответственно. The values that are returned for DATEPART (year, date), DATEPART (month, date), and DATEPART (day, date) are the same as those returned by the functions YEAR, MONTH, and DAY, respectively.

iso_week datepart iso_week datepart

Стандарт ISO 8601 включает в себя систему отсчета дней и недель ISO. ISO 8601 includes the ISO week-date system, a numbering system for weeks. Каждая неделя приписывается тому году, в котором находится ее четверг. Each week is associated with the year in which Thursday occurs. Например, первая неделя 2004 г. (2004W01) считается с понедельника 29 декабря 2003 г. по воскресенье 4 января 2004 г. For example, week 1 of 2004 (2004W01) covered Monday, 29 December 2003 to Sunday, 4 January 2004. Этот стиль нумерации обычно используется в странах и регионах Европы. European countries / regions typically use this style of numbering. В других странах он применяется редко. Non-European countries / regions typically do not use it.

Примечание. Наибольшее число недель в году может составлять 52 или 53. Note: the highest week number in a year could be either 52 or 53.

Система отсчета недель в разных странах и регионах может не совпадать со стандартом ISO. The numbering systems of different countries/regions might not comply with the ISO standard. В таблице ниже представлено шесть возможных вариантов. This table shows six possibilities:

Первый день недели First day of week Содержание первой недели года First week of year contains Двойное присвоение недель Weeks assigned two times Применяется в: Used by/in
Воскресенье Sunday 1 января, 1 January,

Первая суббота, First Saturday,

1–7 дней года 1-7 days of year

Да YesСША United StatesПонедельник Monday 1 января, 1 January,

Первое воскресенье, First Sunday,

1–7 дней года 1-7 days of year

Да YesБольшинство стран Европы, а также Великобритания Most of Europe and the United KingdomПонедельник Monday 4 января, 4 January,

Первый четверг First Thursday,

4–7 дней года 4-7 days of year

нет NoISO 8601, Норвегия и Швеция ISO 8601, Norway, and SwedenПонедельник Monday 7 января, 7 January,

Первый понедельник First Monday,

7 дней года 7 days of year

нет NoСреда Wednesday 1 января, 1 January,

Первый вторник, First Tuesday,

1–7 дней года 1-7 days of year

Да YesСуббота Saturday 1 января, 1 January,

Первая пятница, First Friday,

1–7 дней года 1-7 days of year

Да Yes

tzoffset tzoffset

DATEPART возвращает значение tzoffset (tz) как количество минут (со знаком). DATEPART returns the tzoffset (tz) value as the number of minutes (signed). В результате выполнения этой инструкции возвращается смещение часового пояса 310 минут: This statement returns a time zone offset of 310 minutes:

Функция DATEPART отображает значение tzoffset описанным ниже образом. DATEPART renders the tzoffset value as follows:

  • Для datetimeoffset и datetime2 значение tzoffset возвращает временное смещение в минутах, причем для datetime2 смещение всегда равно 0 минут. For datetimeoffset and datetime2, tzoffset returns the time offset in minutes, where the offset for datetime2 is always 0 minutes.
  • Для типов данных, которые могут быть неявно преобразованы в datetimeoffset или datetime2, функция DATEPART возвращает временное смещение в минутах. For data types that can implicitly convert to datetimeoffset or datetime2, DATEPART returns the time offset in minutes. Для остальных типов даты и времени этого не происходит. Exception: other date / time data types.
  • Для параметров любых других типов возвращается ошибка. Parameters of all other types result in an error.

Аргумент даты типа smalldatetime smalldatetime date Argument

Для значения date типа smalldatetime функция DATEPART возвращает количество секунд 00. For a smalldatetime date value, DATEPART returns seconds as 00.

Возвращается значение по умолчанию для аргумента функции datepart, который отличен от даты Default Returned for a datepart That Is Not in a date Argument

Если тип данных аргумента date не содержит указанной части datepart, функция DATEPART вернет значение по умолчанию для этой части datepart, только если для date указан литерал. If the date argument data type does not have the specified datepart, DATEPART will return the default for that datepart only when a literal is specified for date.

Например, значение «год-месяц-день» по умолчанию для любого типа данных date равно 1900-01-01. For example, the default year-month-day for any date data type is 1900-01-01. Приведенная ниже инструкция содержит аргументы компонентов даты для datepart, аргумент времени для date и возвращает 1900, 1, 1, 1, 2 . This statement has date part arguments for datepart, a time argument for date, and it returns 1900, 1, 1, 1, 2 .

Если аргумент date указан как переменная или столбец таблицы и тип данных этой переменной или столбца не содержит указанной части datepart, функция DATEPART возвращает ошибку 9810. If date is specified as a variable or table column, and the data type for that variable or column does not have the specified datepart, DATEPART will return error 9810. В этом примере переменная @t имеет тип данных time. In this example, variable @t has a time data type. Этот пример завершается ошибкой, потому что год даты не является допустимым для типа данных time: The example fails because the date part year is invalid for the time data type:

Доли секунды Fractional seconds

Эти инструкции демонстрируют, что функция DATEPART возвращает доли секунды: These statements show that DATEPART returns fractional seconds:

Remarks Remarks

Функция DATEPART может использоваться в предложениях выбора из списка, WHERE, HAVING, GROUP BY и ORDER BY. DATEPART can be used in the select list, WHERE, HAVING, GROUP BY, and ORDER BY clauses.

В SQL Server 2019 (15.x) SQL Server 2019 (15.x) функция DATEPART неявно приводит строковые литералы к типу datetime2. DATEPART implicitly casts string literals as a datetime2 type in SQL Server 2019 (15.x) SQL Server 2019 (15.x) . Это означает, что DATENAME не поддерживает формат ГЧМ (год, число, месяц) при передаче даты в виде строки. This means that DATENAME does not support the format YDM when the date is passed as a string. Для использования формата ГЧМ (год, число, месяц) необходимо явно привести строку к типу datetime или smalldatetime. You must explicitly cast the string to a datetime or smalldatetime type to use the YDM format.

Примеры Examples

В этом примере возвращается базовый год. This example returns the base year. Его значение используется при расчетах, связанных с датами. The base year helps with date calculations. В примере дата указана как число. In the example, a number specifies the date. Обратите внимание на то, что SQL Server SQL Server интерпретирует 0 как 1 января 1900 г. Notice that SQL Server SQL Server interprets 0 as January 1, 1900.

В приведенном ниже примере возвращается часть даты 12/20/1974 , представляющая день. This example returns the day part of the date 12/20/1974 .

Результирующий набор: Here is the result set.

В приведенном ниже примере возвращается часть даты 12/20/1974 , представляющая год. This example returns the year part of the date 12/20/1974 .

Результирующий набор: Here is the result set.

11 плюса

111 Репутация автора

Если вы хотите использовать CONVERT и получить тот же вывод, что и в исходном поставленном вопросе, то есть yyyy-mm-dd, затем использовать CONVERT(varchar(10),[SourceDate as dateTime],121) тот же код, что и ответы предыдущей пары, но код для преобразования в yyyy-mm-dd с тире 121.

Если я смогу войти в свой мыльный ящик на секунду, этот вид форматирования не относится к уровню данных , и поэтому он был невозможен без глупых «трюков» с высокими накладными расходами до SQL Server 2008, когда фактические типы данных datepart представил. Выполнение таких преобразований на уровне данных является огромной тратой накладных расходов на вашу СУБД, но, что более важно, в момент, когда вы делаете что-то подобное, вы в основном создавали потерянные в памяти данные, которые, как я полагаю, затем вы вернетесь в программу. Вы не можете поместить его обратно в другой столбец 3NF + или сравнить его с чем-либо набранным без возврата, поэтому все, что вы сделали, — это добавили точки отказа и удалили реляционную ссылку.

Вы должны ВСЕГДА идти вперед и возвращать свой тип данных dateTime вызывающей программе и на уровне PRESENTATION вносить любые необходимые изменения. Как только вы преобразуете вещи перед тем, как возвращать их вызывающей стороне, вы удаляете все надежды на ссылочную целостность из приложения. Это предотвратит операцию ОБНОВЛЕНИЕ или УДАЛЕНИЕ, опять же, если вы не сделаете какую-то ручную реверсию, которая снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.

Автор: Focusyn Размещён: 26.07.2012 08:00

9 плюса

304 Репутация автора

Чтобы получить указанный результат, я использую следующую команду.

Я Holpe это полезно.

6 плюса

79 Репутация автора

Я думаю, что это будет работать в вашем случае:

17 плюса

327 Репутация автора

Для возврата в формате даты

Приведенный выше код будет работать в SQL Server 2010

Он вернется, как 12. 12.2013

Для SQL Server 2012 используйте код ниже

9 плюса

91 Репутация автора

Если вам нужен результат в типе varchar, вы должны пройти через

который уже упоминался выше

Если вам нужен результат в формате даты и времени, вам нужно выполнить любой из следующих запросов

1) в SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) качестве OnlyDate — 2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) as OnlyDate — 2014-03-26 00: 00: 00.000

—2014-03-26 00: 00: 00.000

2 плюса

21 Репутация автора

Вы можете использовать следующие для части даты и форматирования даты:

DATENAME => Возвращает символьную строку, которая представляет указанную часть даты указанной даты

DATEADD => DATEPART() Функция используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. Д.

DATEPART => Возвращает целое число, которое представляет указанную часть даты указанной даты.

CONVERT() => CONVERT() Функция — это общая функция, которая преобразует выражение одного типа данных в другой. Эта CONVERT() функция может использоваться для отображения данных даты / времени в разных форматах.

8 плюса

108 Репутация автора

3 плюса

2147 Репутация автора

почему вы не используете DATE_FORMAT (your_datetiem_column, ‘% d-% m-% Y’)?

EX: select DATE_FORMAT( some_datetime_column, ‘%d-%m-%Y’ ) from table_name

Вы можете изменить последовательность m, d и год, переставив ‘%d-%m-%Y’ часть

5 плюса

51 Репутация автора

5 плюса

4435 Репутация автора

Даже используя древний MSSQL Server 7.0, код здесь (благодаря этой ссылке ) позволил мне получить любой формат даты, который я искал в то время:

Это произвело этот вывод:

4 плюса

2434 Репутация автора

Я поддерживаю следующее, которое не было упомянуто:

Он также не заботится о локальном или двойном преобразовании — хотя каждый datepart, вероятно, выполняет математику. Так что это может быть немного медленнее, чем метод датедифф, но для меня это гораздо более понятно. Особенно, когда я хочу сгруппировать по году и месяцу (установите день на 1).

3 плюса

4223 Репутация автора

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

Автор: Imad Размещён: 21.10.2015 04:54

3 плюса

5886 Репутация автора

Я знаю, что это старо, но я не вижу, где кто-то так сказал. Из того, что я могу сказать, это стандарт ANSI.

Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную ANSI CURRENT_DATE.

Автор: lit Размещён: 15.01.2016 06:14

6 плюса

5411 Репутация автора

Хорошо, хотя я немного опоздал :), вот другое решение.

Результат

И если вы используете SQL Server 2012 и выше, вы можете использовать FORMAT() такую ​​функцию —

7 плюса

91 Репутация автора

Если вы присваиваете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.

4 плюса

1161 Репутация автора

4 плюса

189 Репутация автора

На SQL Server 2000

4 плюса

1467 Репутация автора

Начиная с SQL SERVER 2012, вы можете сделать это:

SELECT FORMAT(GETDATE(), ‘yyyy-MM-dd 00:00:00.000’)

Автор: xbb Размещён: 20.07.2016 03:58

10 плюса

34756 Репутация автора

Если вы используете

SQL Server 2012 или более поздней версии ,

Уже есть несколько ответов и типов форматирования для сервера SQL. Но большинство методов несколько двусмысленны, и вам будет трудно запомнить числа для типа формата или функций относительно конкретного формата даты. Вот почему в следующих версиях SQL-сервера есть лучший вариант.

Опция культуры очень полезна, так как вы можете указать дату согласно вашим зрителям.

Вы должны запомнить d (для маленьких рисунков) и D (для длинных рисунков).

1. «d» — образец короткой даты.

2. «Д» — длинная дата.

Больше примеров в запросе.

Если вы хотите больше форматов, вы можете перейти к:

TIMESTAMPADD(interval, n, date) функция добавляет к дате date временной интервал n, значения которого задаются параметром interval. Возможные значения параметра interval:

FRAC_SECOND — микросекунды
SECOND — секунды
MINUTE — минуты
HOUR — часы
DAY — дни
WEEK — недели
MONTH — месяцы
QUARTER — кварталы
YEAR — годы

TIMESTAMPDIFF(interval, date1, date2) функция вычисляет разницу между датами date2 и date1 в единицах, указанных в параметре interval. Возможные значения параметра interval:

FRAC_SECOND — микросекунды
SECOND — секунды
MINUTE — минуты
HOUR — часы
DAY — дни
WEEK — недели
MONTH — месяцы
QUARTER — кварталы
YEAR — годы

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

Видеоуроки php + mysql

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

В таблицах Excel предусмотрена возможность работы с различными видами текстовой и числовой информации. Доступна и обработка дат. При этом может возникнуть потребность вычленения из общего значения конкретного числа, например, года. Для этого существует отдельные функции: ГОД, МЕСЯЦ, ДЕНЬ и ДЕНЬНЕД.

Примеры использования функций для обработки даты в Excel

Таблицы Excel хранят даты, которые представлены в качестве последовательности числовых значений. Начинается она с 1 января 1900 года. Этой дате будет соответствовать число 1. При этом 1 января 2009 года заложено в таблицах, как число 39813. Именно такое количество дней между двумя обозначенными датами.

Функция ГОД используется аналогично смежным:

  • МЕСЯЦ;
  • ДЕНЬ;
  • ДЕНЬНЕД.

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

Чтобы воспользоваться функцией ГОД, нужно ввести в ячейку следующую формулу функции с одним аргументом:

=ГОД(адрес ячейки с датой в числовом формате)

Аргумент функции является обязательным для заполнения. Он может быть заменен на «дата_в_числовом_формате». В примерах ниже, вы сможете наглядно увидеть это. Важно помнить, что при отображении даты в качестве текста (автоматическая ориентация по левому краю ячейки), функция ГОД не будет выполнена. Ее результатом станет отображение #ЗНАЧ. Поэтому форматируемые даты должны быть представлены в числовом варианте. Дни, месяцы и год могут быть разделены точкой, слешем или запятой.

Рассмотрим пример работы с функцией ГОД в Excel. Если нам нужно получить год из исходной даты нам не поможет функция ПРАВСИМВ так как она не работает с датами, а только лишь текстовыми и числовыми значениями. Чтобы отделить год, месяц или день от полной даты для этого в Excel предусмотрены функции для работы с датами.

Пример: Есть таблица с перечнем дат и в каждой из них необходимо отделить значение только года.

Введем исходные данные в Excel.

Для решения поставленной задачи, необходимо в ячейки столбца B ввести формулу:

=ГОД (адрес ячейки, из даты которой нужно вычленить значение года)

В результате мы извлекаем года из каждой даты.

Аналогичный пример работы функции МЕСЯЦ в Excel:

Пример работы c функциями ДЕНЬ и ДЕНЬНЕД. Функция ДЕНЬ получает вычислить из даты число любого дня:

Функция ДЕНЬНЕД возвращает номер дня недели (1-понедельник, 2-второник… и т.д.) для любой даты:

Во втором опциональном аргументе функции ДЕНЬНЕД следует указать число 2 для нашего формата отсчета дня недели (с понедельника-1 по восркесенье-7):

Если пропустить второй необязательный для заполнения аргумент, тогда будет использоваться формат по умолчанию (английский с воскресенья-1 по суботу-7).

Создадим формулу из комбинаций функций ИНДЕКС и ДЕНЬНЕД:

Получим более понятный вид реализации данной функции.

Примеры практического применения функций для работы с датами

Эти примитивные функции очень полезны при группировки данных по: годам, месяцам, дням недели и конкретным дням.

Допустим у нас имеется простой отчет по продажам:

Нам нужно быстро организовать данные для визуального анализа без использования сводных таблиц. Для этого приведем отчет в таблицу где можно удобно и быстро группировать данные по годам месяцам и дням недели:

Теперь у нас есть инструмент для работы с этим отчетом по продажам. Мы можем фильтровать и сегментировать данные по определенным критериям времени:

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

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

Стоит сразу отметить что для того чтобы получить разницу между двумя датами нам не поможет ни одна из выше описанных функций. Для данной задачи следует воспользоваться специально предназначенной функцией РАЗНДАТ:

Тип значений в ячейках «дата» требует особого подхода при обработке данных. Поэтому следует использовать соответствующие данному типу функции в Excel.

Мне нужно получить доступ только месяц.Год от даты поле в SQL Server.

17 ответов

а также предложения, приведенные уже, есть еще одна возможность, которую я могу сделать из вашего вопроса:
— Вы все еще хотите, чтобы результатом была дата
— Но вы хотите «отбросить» дни, часы и т. д.—2—> — Оставляя год / месяц только поле даты

это получает количество целых месяцев от базовой даты (0), а затем добавляет их к этой базовой дате. Таким образом, округляется до месяца, в котором находится дата.

Примечание: В SQL Server 2008 Вы еще есть время прилагается в 00:00:00.000 Это не совсем то же самое, что «удаление» любых обозначений дня и времени вообще. Также день установлен на первый. например 2009-10-01 00:00:00.000

Как вывести месяц в sql

Получение только месяца и года с даты SQL

Мне нужно получить доступ только месяц.Год от даты поле в SQL Server.

17 ответов

а также предложения, приведенные уже, есть еще одна возможность, которую я могу сделать из вашего вопроса:
— Вы все еще хотите, чтобы результатом была дата
— Но вы хотите «отбросить» дни, часы и т. д.—2—> — Оставляя год / месяц только поле даты

это получает количество целых месяцев от базовой даты (0), а затем добавляет их к этой базовой дате. Таким образом, округляется до месяца, в котором находится дата.

Примечание: В SQL Server 2008 Вы еще есть время прилагается в 00:00:00.000 Это не совсем то же самое, что «удаление» любых обозначений дня и времени вообще. Также день установлен на первый. например 2009-10-01 00:00:00.000

Руководство по SQL. Функции даты.

Ниже приведён список важных функций, которые относятся к дате и времени. Все данные функции доступны для работы с помощью SQL.

Примеры, приведённые ниже предназначены для RDBMS MySQL.

Name Description
ADDDATE() Добавляет дату
ADDTIME() Добавляет время
CONVERT_TZ() Конвертирует одну временную зону в другую.
CURDATE() Возвращает текущую дату.
CURRENT_DATE(), CURRENT_DATE То же самое, что и CURDATE.
CURTIME() Возвращает текущее время
NOW() Возвращает текущие дату и время.
CURRENT_TIME(), CURRENT_TIME То же самое, что и NOW()
DATE_ADD() Добавляет две даты
DATE_FORMAT() Определяет формат даты
DATE_SUB() Разбивает две даты
DATE() Возвращает только дату (число, месяц, год) из даты.
DATEDIFF() Разделяет две даты
DAY() То же самое, что и DAYOFMONTH()
DAYNAME() Возвращает имя дня недели.
DAYOFMONTH() Возвращает день месяца
DAYOFWEEK() Возвращает индекс аргумента дня недели
DAYOFYEAR() Возвращает номер дня в году (1 – 366)
EXTRACT Выдаёт часть даты
FROM_DAYS() Конвертирует номер дня в дату.
FROM_UNIXTIME() Форматирует дату в дата/время для UNIX систем.
HOUR() Возвращает часы
LAST_DAY Возвращает крайний день месяца.
LOCALTIME(), LOCALTIME То же самое, что и NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP() То же самое, что и NOW()
MAKEDATE() Создаёт дату из года и дня в году
MAKETIME Создаёт время
MICROSECOND() Возвращает микросекунды
MINUTE() Возвращает только минуты
MONTH() Возвращает только месяц
MONTHNAME() Возвращает имя месяца
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP Синоним для NOW()
PERIOD_ADD() Добавляет период для в месяце-году.
PERIOD_DIFF() Возвращает количество месяцев в периоде.
QUARTER() Возвращает квартал
SEC_TO_TIME() Конвертирует секунды в формат ‘ЧЧ:ММ:СС’
SECOND() Возвращает секунды (0 – 59)
STR_TO_DATE() Конвертирует строку в дату
SUBDATE() То же самое, что и DATE_SUB() Требует три аргумента
SUBTIME() Разделяет время
SYSDATE() Возвращает системное время
TIME_FORMAT() Определяет формат времени
TIME_TO_SEC() Конвертирует время в секунды
TIME() Возвращает время.
TIMEDIFF() Отделяет время
TIMESTAMP() Возвращает текущие дату и время.
TIMESTAMPADD() Добавляет период дата/время
IMESTAMPDIFF() Отделяет интервал из дата/время
TO_DAYS() Конвертирует дату в дни
UNIX_TIMESTAMP() Возвращает дату/время для UNIX систем
UTC_DATE() Возвращает дату UTC
UTC_TIME() Возвращает время UTC
UTC_TIMESTAMP() Возвращает дату/время UTC
WEEK() Возвращает номер недели
WEEKDAY() Возвращает индекс дня недели
WEEKOFYEAR() Возвращает номер недели в году (1 – 53)
YEAR() Возвращает год
YEARWEEK() Возвращает год и неделю

Примеры

Добавление даты (ADDDATE)

Добавление времени (ADDTIME)

Конвертация временной зоны (CONVERT_TZ)

Текущая дата (CURDATE())

Текущее время (CURTIME())

Дата (DATE)

Разница во времени (DATEDIFF())

Добавление даты (DATEADD(), DATE_SUB())
Данные функции обеспечивают арифметику дат. Мы можем добавить или отнять определённый интервал времени от определённой даты.

Ниже приведена таблица, в которой указаны возможные аргументы для интервалов:

Значение Ожидаемый формат
MICROSECOND Микросекунды
SECOND Секунды
MINUTE Минуты
HOUR Часы
DAY Дни
WEEK Недели
MONTH Месяцы
QUARTER Кварталы
YEAR Годы
SECOND_MICROSECOND ‘Секунды.Микросекунды’
MINUTE_MICROSECOND Минуты.Микросекунды’
MINUTE_SECOND ‘Минуты.Секунды’
HOUR_MICROSECOND ‘Часы.Микросекунды’
HOUR_SECOND ‘Часы.Секунды.Микросекунды’
HOUR_MINUTE ‘Часы. Минуты’
DAY_MICROSECOND ‘Дни.Микросекунды’
DAY_SECOND Дни.Часы.Минуты.Секунды
DAY_MINUTE Дни.Часы.Минуты
DAY_HOUR Дни.Часы
YEAR_MONTH Года.Месяцы

Формат даты
Формат даты определяется с помощью специальных символов.
Список таких символов приведён в таблице, которая находится ниже:

Спецификатор Описание
%a Сокращённое имя дня недели
%b Сокращённое имя месяца
%c Номер месяца
%D День месяца с английским суффиксом
%d Номер дня в месяце (00 … 31)
%e Номер дня в месяце (0 … 31)
%f Микросекунды (000000 … 999999)
%H Часы (00 … 23)
%h Часы (01 … 12)
%I Часы (01 … 12)
%i Минуты (00 … 59)
%j Дни года (001 … 366)
%k Часы (00 … 23)
%l Часы (1 … 12)
%M Имя месяца
%m Номер месяца
%p AM или PM
%r Время с использованием AM или PM
%S Секунды (00 … 59)
%s Секунды (00 … 59)
%T Время (ЧЧ:ММ:СС)
%U Неделя (00 … 53). Первый день недели – Воскресенье
%u Неделя (00 … 53). Первый день недели – Понедельник
%V Неделя (00 … 53). Первый день недели – Воскресенье. Используется с %X
%v Неделя (00 … 53). Первый день недели – Понедельник. Используется с %x
%W День недели
%w День недели (0 – Воскресенье … 6 – Суббота)
%X Год для недели. Воскресенье – первый день недели. Используется с %V
%x Год для недели. Понедельник – первый день недели. Используется с %v
%Y Год (YYYY)
%y Год (YY)
%% Символ .%.
%x То же самое для любых элементов, указанных выше

Имя дня (DAYNAME())

День месяца (DAYOFMONTH())

День недели (DAYOFWEEK())

День в году (DAYOFYEAR())

Неделя (WEEK())

На этом мы заканчиваем изучение функций даты в языке SQL.
В следующей статье мы рассмотрим временные таблицы.

Примеры работы с датами в Oracle

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

Вычисления текущего дня, месяца и т.д. с помощью SQL

Текущая неделя

Прошедшая неделя

Следующая неделя

Текущий месяц

Прошедший месяц

Следующий месяц

Текущий квартал

Прошлый квартал

Следующий квартал

Текущий год

Прошедший год

Следующий год

Нужно будет упростить вычисления, если это возможно.
Я писал на лету и сам эти вычисления не использую. Т.е. допускаю, что где-то закралась ошибка. Если что, поправлю.

Tags: Oracle, sql, вычисление дат

PL/SQL

Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.

текущая дата и другие функции даты в времени

Функция текущей даты SQL CURDATE() и её аналоги CURRENT_DATE() и CURRENT_DATE среди других функций даты и времени применяются наиболее часто из-за широких возможностей, обеспечиваемых ими для анализа данных. Знакомство с функциями даты и времени начнём с разбора практических примеров, демонстрирующих возможности функции текущей даты. А затем перейдём к остальным функциям даты и времени, соблюдая для удобства их классификацию по назначению.

Функция текущей даты CURDATE() возвращает значение текущей даты в формате ‘YYYY-MM-DD’ и ‘YYYYDDMM’. Вычисляя несколькими способами (их как раз и разберём в этом параграфе) разницу значений дат, можно определить такие важные значения, как возраст человека, его трудовой стаж, продолжительность различных процессов и явлений и многое другое.

В примерах работаем с базой данных «Театр». Таблица Play содержит данные о постановках. Таблица Team — о ролях актёров. Таблица Actor — об актёрах. Таблица Director — о режиссёрах. Поля таблиц, первичные и внешние ключи можно увидеть на рисунке ниже (для увеличения нажать левой кнопкой мыши).

Это уже база с большим объёмом данных по сравнению с примерами ко многим другим темам нашего курса. Поэтому не будем приводить строки данных таблиц и таблицы результатов запросов. Однако это будет компенсировано подробным разбором логики построения запросов, которые, надо признать, имеют достаточно высокую сложность.

Пример 1. Сформировать список актеров старше 70 лет. Пишем следующий запрос:

SELECT FName, LName, BirthDate FROM ACTOR WHERE TIMESTAMPDIFF(YEAR, BirthDate, CURDATE()) > 70

В этом запросе вычисляется разница между текущей датой CURDATE() и датой рождения актёра BirthDate, содержащейся в таблице ACTOR.

Для вычисления разницы применена функция TIMESTAMPDIFF(). Ключевое слово YEAR — задаёт единицу измерения — в годах интервала между датами. Вычисленное значение и результат его сравнения с числом 70 вполне пригодны в качестве условия выборки в секции WHERE. Следует учесть, что функция TIMESTAMPDIFF() существует лишь в MySQL. В других диалектах SQL для этого есть функция DATEDIFF, а для задания единицы измерения применяются различные ключевые слова в различных вариантах написания.

Для вычисления разницы дат можно использовать и оператор «минус». Это сделано в следующем примере.

Пример 2. Вывести список актеров, которые не задействованы в новых постановках (в постановках последних 3 лет). Использовать CURDATE(), NOT IN. Запрос будет следующим:

SELECT fname, lname FROM actor WHERE actor_id NOT IN(SELECT actor_id FROM team WHERE play_id IN(SELECT play_id FROM play WHERE YEAR(premieredate) — YEAR(CURDATE())

В этом запросе задействована функция YEAR(). Аргументами её являются дата премьеры постановки premieredate из таблицы play и текущая дата. Для вычисления разницы использован оператор «минус». Он имеет больший приоритет по сравнению с оператором сравнения и поэтому выполняется первым. Вычисленнное выражение сравнивается с числом 3 и подходящие значения служат условием выборки из таблицы play, содержащей данные о постановках. Этот подзапрос — самый глубокий в «матрёшке» целого запроса. Подзапрос более высокого уровня из таблицы team, содержащей данные о ролях, выбирает идентификаторы актёров, с помощью предиката IN. Выбираются те актёры, которые участвовали в постановках трёх послежних лет. И, наконец, самый внешний запрос к таблице actor выбирает значения с отрицанием (NOT IN) значения предыдущего подзапроса.

  • Страница 2 (Примеры с функцией DATEDIFF MS SQL Server)
  • Страница 3 (Примеры с функцией DATEADD MS SQL Server)

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

Пример 3. Сформировать список актеров с их стажем (в днях). Использовать CURDATE(), GROUP BY. Запрос будет следующим:

SELECT DISTINCT a.Actor_ID, a.FName, a.LName, CURDATE() — p1.PremiereDate AS ExpDays FROM Play p1 JOIN Team t1 ON p1.play_id = t1.play_id JOIN Actor a ON t1.actor_id = a.Actor_id WHERE t1.ACTOR_ID = a.Actor_ID ORDER BY ExpDays, a.Actor_ID DESC

В этом запросе разница между текущей датой CURDATE() и датой премьеры постановки PremiereDate из таблицы Play вычисляется как имя столбца в результирующей таблице. Поскольку эти даты имеют один и тот же формат, для вычисления разницы достаточно использовать оператор «минус». Разница вычислена. Но из таблицы Play невозможно напрямую «достучаться» до таблицы Actor, содержащей данные об актёрах. Поэтому используем соединение (JOIN) этой таблицы с таблицей Team, которая уже связана с таблицей Actor при помощи ключа Actor_ID. Соединение таблиц Team и Actor — второе в этой цепочке из трёх таблиц.

Составить SQL запросы с текущей датой самостоятельно, а затем посмотреть решения

Пример 4. Определить самого востребованного актера за последние 5 лет. Оператор JOIN использовать 2 раза. Использовать CURDATE(), LIMIT 1.

Правильное решение и комментарий.

Пример 5. Определить спектакли, в которых средний возраст актеров от 20 до 30 (использовать BETWEEN, GROUP BY, AVG).

Правильное решение и комментарий.

В последующих параграфах приведено большинство функций даты и времени, используемых в СУБД MySQL. А примеры использования наиболее часто применимых в MS SQL Server функций DATEDIFF и DATEADD приведены соответственно на странице 2 и странице 3.

CURDATE(), CURRENT_DATE(), CURRENT_DATE — возвращают текущую дату в формате ‘YYYY-MM-DD’ или YYYYDDMM в зависимости от того, вызывается функция в текстовом или числовом контексте.

CURTIME(), CURRENT_TIME(), CURRENT_TIME — возвращают текущее время суток в формате ‘hh-mm-ss’ или hhmmss в зависимости от того, вызывается функция в текстовом или числовом контексте.

NOW() — возвращает текущие дату и время формате ‘YYYY-MM-DD hh:mm:ss’ или YYYYDDMMhhmmss в зависимости от того, вызывается функция в текстовом или числовом контексте.

TIMEDIFF(param1, param2) — возвращает разницу между значениями времени, заданными параметрами param1 и param2.

DATEDIFF(param1, param2) — возвращает разницу между датами param1 и param2. Значения param1 и param2 могут иметь типы DATE или DATETIME, а при вычислении разницы используется лишь часть DATE.

PERIOD_DIFF(param1, param2) — возвращает разницу в месяцах между датами param1 и param2. Значения param1 и param2 могут быть представлены в числовом формате YYYYMM или YYMM.

TIMESTAMPDIFF(interval, param1, param2) — возвращает разницу между значениями датами param1 и param2. Значения param1 и param2 могут быть представлены в форматах ‘YYYY-MM-DD’ или ‘YYYY-MM-DD hh:mm:ss’. Единица измерения разницы задаётся параметром interval. Он может принимать значения FRAC_SECOND (микросекунды), SECOND (секунды), MINUTE (минуты), HOUR (часы), DAY (дни), WEEK (недели), MONTH (месяцы), QUARTER (кварталы), YEAR (годы).

  • Страница 2 (Примеры с функцией DATEDIFF MS SQL Server)
  • Страница 3 (Примеры с функцией DATEADD MS SQL Server)

ADDDATE(date, INTERVAL value) — возвращает дату, к которой прибавлено значение value. Ключевое слово INTERVAL обязательно следует в запросе, после него указывается значение value, а затем единицы измерения прибавляемого значения. Ими могут быть SECOND (секунды), MINUTE (минуты), HOUR (часы), MINUTE_SECOND (минуты и секунды), HOUR_MINUTE (часы и минуты), DAY_SECOND (дни, часы минуты и секунды), DAY_MINUTE (дни, часы и минуты), DAY_HOUR (дни и часы), YEAR_MONTH (годы и месяцы).

SUBDATE(date, INTERVAL value) — вычитает из величины даты date произвольный временной интервал и возвращает результат. Ключевое слово INTERVAL обязательно следует в запросе, после него указывается значение value, а затем единицы измерения вычитаемого значения. Возможные единицы измерения — те же, что и для функции ADDDATE().

SUBTIME(datetime, time) — вычитает из величины времени datetime вида ‘YYYY-MM-DD hh:mm:ss’ произвольно заданное значение времени time и возвращает результат.

PERIOD_ADD(period, N) — добавляет N месяцев к значению даты period. Значение period должно быть представлено в числовом формате ‘YYYYMM’ или ‘YYMM’.

TIMESTAMPADD(interval, param1, param2) — прибавляет к дате и времени суток param2 в полном или кратком формате временной интервал param1, единицы измерения которого заданы параметром interval. Возможные единицы измерения — те же, что и для функции TIMESTAMPDIFF().

  • Страница 2 (Примеры с функцией DATEDIFF MS SQL Server)
  • Страница 3 (Примеры с функцией DATEADD MS SQL Server)

DATE(datetime) — извлекает из значения даты и времени суток в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’) только дату, отсекая часы, минуты и секунды.

TIME(datetime) — извлекает из значения даты и времени суток в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’) только время суток, отсекая дату.

TIMESTAMP(param) — принимает в качестве аргумента дату и время суток в полном или кратком формате и возвращает полный вариант в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’).

DAY(date), DAYOFMONTH(date) — принимают в качестве аргумента дату, и возвращают порядковый номер дня в месяце (от 1 до 31).

DAYNAME(date) — принимает в качестве аргумента дату, и возвращает день недели в виде полного слова на английском языке.

DAYOFWEEK(date) — принимает в качестве аргумента дату, и возвращает порядкоый номер дня недели от 1 (воскресенье) до 7 (суббота).

WEEKDAY(date) — принимает в качестве аргумента дату, и возвращает порядкоый номер дня недели от 0 (понедельник) до 6 (воскресенье).

WEEK(date) — принимает в качестве аргумента дату, и возвращает номер недели в году для этой даты от 0 до 53.

WEEKOFYEAR(datetime) — возвращает порядковый номер недели в году для даты datetime от 1 до 53.

MONTH(datetime) — возвращает числовое значение месяца года от 1 до 12 для даты datetime.

MONTHNAME(datetime) — возвращает строку с названием месяца для даты datetime.

QUARTER(datetime) — возвращает значение квартала от 1 до 4 для даты datetime, которая может быть передана в формате ‘YYYY-MM-DD’ или ‘YYYY-MM-DD hh:mm:ss’.

YEAR(datetime) — возвращает год от 1000 до 9999 для даты datetime.

DAYOFYEAR(date) — возвращает порядковый номер дня в году от 1 до 366 для даты date.

HOUR(datetime) — возвращает значение часа от 0 до 23 для времени datetime.

MINUTE(datetime) — возвращает значение минут от 0 до 59 для времени datetime.

SECOND(time) — возвращает количество секунд для времени суток time, которое задаётся либо в виде строки ‘hh:mm:ss’, либо числа hhmmss.

EXTRACT(type FROM datetime) — принимает дату и время суток datetime и возвращает часть, определяемую параметром type. Значениями параметра могут быть YEAR, MONTH, DAY, HOUR, MINUTE, SECOND.

  • Страница 2 (Примеры с функцией DATEDIFF MS SQL Server)
  • Страница 3 (Примеры с функцией DATEADD MS SQL Server)

TO_DAYS(date) — принимает дату date в кратком ‘YYYY-MM-DD’ или полном формате ‘YYYY-MM-DD hh:mm:ss’ и возвращает количество дней, прошедших с нулевого года.

FROM_DAYS(N) — принимает количество дней N, прошедших с нулевого года, и возвращает дату в формате ‘YYYY-MM-DD’.

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(datetime) — если параметр не указан, то возвращает количество секунд, прошедших с 00:00 1 января 1970 года. Если параметр datetime указан (в кратком ‘YYYY-MM-DD’ или полном формате ‘YYYY-MM-DD hh:mm:ss’), то возвращает разницу в секундах между 00:00 1 января 1970 года и датой datetime.

FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp, format) — принимает количество секунд, прошедших с 00:00 1 января 1970 года и возвращает дату и время суток в виде строки ‘YYYY-MM-DD hh:mm:ss’ или в виде числа YYYYDDMMhhmmss в зависимости от того, вызвана функция в строковом или числовом контексте.

TIME_TO_SEC(time) — принимает время суток time в формате ‘hh:mm:ss’ и возвращает количество секунд, прошедших с начала суток.

SEC_TO_TIME(seconds) — принимает количество секунд seconds, прошедших с начала суток и возвращает время в формате ‘hh:mm:ss’ или hhmmss в зависимости от того, вызвана функция в строковом или числовом контексте.

MAKEDATE(year, dayofyear) — принимает год year, номер дня в году dayofyear и возвращает дату в формате ‘YYYY-MM-DD’.

MAKETIME(hour, minute, second) — принимает часы hour, минуты minute и секунды second и возвращает время суток в формате ‘hh:mm:ss’.

  • Страница 2 (Примеры с функцией DATEDIFF MS SQL Server)
  • Страница 3 (Примеры с функцией DATEADD MS SQL Server)

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

НазадЛистатьВперёд>>>

Записи запросов SQL для текущего дня, этого месяца, этой недели

Теги:  SQL  SQL Server  ASP  Access  QQ

 

- Запросите день:
select * from info where DateDiff(dd,datetime,getdate())=0
 - Запрос в течение 24 часов:
select * from info where DateDiff(hh,datetime,getDate())<=24
 --info - имя таблицы, а datetime - значение поля в базе данных. 

 

- Альтернативный метод запроса записи дня
SELECT *
FROM j_GradeShop
WHERE (GAddTime BETWEEN CONVERT(datetime, LEFT(GETDATE(), 10) + ' 00:00:00.000') 
      AND CONVERT(datetime, LEFT(GETDATE(), 10) + ' 00:00:00.000') + 1)
ORDER BY GAddTime DESC 

 

Функция DATEDIFF:

Синтаксис:

 
DATEDIFF ( datepart , startdate , enddate )

Примечания:

конечная дата минус начальная дата. Если начальная дата позже конечной, возвращается отрицательное значение.

Если результат находится вне диапазона целочисленных значений, DATEDIFF выдаст ошибку. Для миллисекунд максимальное число составляет 24 дня, 20 часов, 31 минуту и ​​23,647 секунды. За секунды максимальное количество составляет 68 лет.

Методы, которые вычисляют через границы минут, секунд и миллисекунд, делают результат, указанный в DATEDIFF, согласованным для всех типов данных. Результатом является целочисленное значение со знаком, равное количеству границ датных частей за первый и второй дни. Например, количество недель между 4 января (воскресенье) и 11 января (воскресенье) равно 1.

 

Может быть протестирован в MSSQL:

- Разница во времени между ними ровно 24
 - способ печати
print dateDiff(hh,'2009-1-1 0:0:0','2009-1-2 0:0:0')
 --- Запрос пути
print dateDiff(hh,'2009-1-1 0:0:0','2009-1-2 0:0:0')

 

- запись месяца 
 SELECT * FROM table WHERE datediff (month, [dateadd], getdate ()) = 0
 
 - Запись недели 
 SELECT * FROM table WHERE datediff (week, [dateadd], getdate ()) = 0
 -Включая эти методы запроса в этом году одинаковы
 

 

sql функция времени на сервере

1. Текущая системная дата и время
     select getdate()  

 

2. dateadd возвращает новое значение datetime после добавления периода времени к указанной дате
Пример: добавление 2 дней к дате
Выберите дату и число (день 2, «2004-10-15») — возврат: 2004-10-17 00: 00: 00. 000

 

3. datediff возвращает количество границ даты и времени между двумя указанными датами.
Выберите дату (день, ‘2004-09-01’, ‘2004-09-18’) — возврат: 17

 

4. datepart возвращает целое число, представляющее указанную часть даты указанной даты.
SELECT DATEPART (месяц, ‘2004-10-15’) — возвращает 10

 

5. datename возвращает строку, представляющую указанную часть даты указанной даты
ВЫБЕРИТЕ имя (день недели, ‘2004-10-15’) — Возврат: пятница

 

6.day (), month (), year () — можно сравнить с datepart

выберите текущую дату = конвертировать (varchar (10), getdate (), 120)
, Текущее время = конвертировать (varchar (8), getdate (), 114)

select datename(dw,’2004-10-15′)

выберите, сколько недель в году = имя даты (week, ‘2004-10-15’)
Это сегодняшний день недели = datename (день недели, ‘2004-10-15’)
  

 

функция Параметр / функция
GetDate( ) Возвращает текущую дату и время системы
DateDiff (interval,date1,date2) Возвращает разницу между date2 и date1 в порядке, указанном интервалом date2-date1
DateAdd (interval,number,date) Дата, указанная в интервале плюс число
DatePart (interval,date) Возвращает целочисленное значение, соответствующее указанной части интервала в дате
DateName (interval,date) Возвращает имя строки, соответствующее указанной части даты в дате

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

 

значение Аббревиатура (Sql Server) Доступ и ASP объяснение
Year Yy yyyy Год 1753 ~ 9999
Quarter Qq q   Сезон 1 ~ 4
Month Mm m   Месяц 1 ~ 12
Day of year Dy y Дни года, день года 1-366
Day Dd d   День 1-31
Weekday Dw w Дни недели, день недели 1-7
Week Wk ww Неделя, неделя года 0 ~ 51
Hour Hh h   Часы 0 ~ 23
Minute Mi n Минут 0 ~ 59
Second Ss s Секунд 0 ~ 59
Millisecond Ms Ms 0 ~ 999

 

 

Access и asp используют date () и now () для получения системной даты и времени; DateDiff, DateAdd и DatePart также можно использовать в Access и asp. Использование этих функций аналогично

 

Например:
1.GetDate () для сервера sql: выберите GetDate ()

2.DateDiff (‘s’, ‘2005-07-20’, ‘2005-7-25 22:56:32’) возвращает значение 514592 секунд
DateDiff (‘d’, ‘2005-07-20’, ‘2005-7-25 22:56:32’) возвращает значение 5 дней

3.DatePart (‘w’, ‘2005-7-25 22:56:32’) Возвращаемое значение: 2, т.е. понедельник (1 в воскресенье, 7 в субботу)
DatePart (‘d’, ‘2005-7-25 22:56:32’) возвращает 25 или 25
DatePart (‘y’, ‘2005-7-25 22:56:32’) возвращает значение 206, что является 206-м днем ​​года
DatePart (‘yyyy’, ‘2005-7-25 22:56:32’) возвращает значение 2005 или 2005



Интеллектуальная рекомендация

Напишите монитор журнала через Websocket

Фронт-код Фоновый код pom WebSocketConfig LogWebsocketHandle LogThread…

hdu 1158 Планирование занятости (динамическое планирование)

Название ссылки: http://acm.hdu.edu.cn/showproblem.php?pid=1158   Отчет о решении проблемы: я чувствую, что уравнение состояния этой проблемы не просто. Сначала я использовал одномерный подход, п…

Пейджинговая клиентская пейджинговая таблица и серверная пейджинговая страница

В этой статье не рассказывается, как использовать этот плагин, в основном представлены вещи, на которые следует обратить внимание при использовании: 1. Пейджинг на стороне сервера Установите свойство …

Redis команда для работы с различными типами

1. Что такое Redis Redis — это высокопроизводительная система хранения ключей и значений с открытым исходным кодом, разработанная с использованием языка Си, которую мы можем представить как карту Java…

Как получить доступ к файловой системе Hadoop через браузер

Как получить доступ к файловой системе Hadoop через браузер Откройте браузер, введите: (Google Browser, то есть не кажется) 192.168.x.xxx:50070 Входить Фронт для вашего собственного IP-адреса виртуаль…

Вам также может понравиться

5. Анализ исходного кода SOFAJRaft — как хранить данные в RheaKV?

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

Используйте Python 3 для обработки задач ввода и выходных данных

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

5 минут Научитесь использовать статистику данных Excel

Использование диапазон Excel, это очень много друзей , которые очевидны, это может сделать основные формы, она также может быть использована для статистических данных или анализа данных, то есть функц…

FRP использовать

необходимость Я использовал Autossh, чтобы нести ответственность за картирование порта на хосте глубокого обучения, чтобы начать несколько команд, и теперь используйте FRP выполнить https://github.com…

Используйте NSurlsession

NSURLSESSE и его связанные классы предоставляют API, загруженные через http. Этот класс предоставляет богатый метод доложения для поддержки проверки, а также выполнения загрузок в фоновом режиме (когд. ..

как генерировать даты и числа

Из этой статьи вы узнаете, как заполнить пустые даты на графике и сформировать гистограмму распределения с помощью SQL.

Published

25.03.2022

|

devtodev

Приветствуем вас в следующей статье из цикла «SQL для начинающих»! В более ранних статьях мы рассказывали о том, с чего начать обучение языку запросов, как вычислять количество активных пользователей, посчитать средний чек и ARPPU с помощью SQL. А теперь предлагаем вам научиться заполнять пустые даты на графике и формировать гистограмму распределения.

Чтобы начать, зайдите в демо devtodev и найдите SQL отчёт во вкладке Reports.

Представим, что нам предстоит построить график совершения какого-либо события, которое происходит в приложении довольно редко, а иногда оно не происходит ни разу за день.

Давайте обратимся к графику покупок пользователей из Италии за последние 14 дней (с 01/10 по 14/10) с помощью следующего запроса:

select eventtime :: date as days
, count() as «Payments count by users from Italy»
from p102968. payments
where eventtime > current_date — interval ’14 day’and eventtime < date_trunc (‘day’, current_date)
and country = ‘IT’
group by 1
order by 1

Результат запроса. Скриншот из демо devtodev

На первый взгляд кажется, что всё хорошо, но если внимательнее посмотреть на ось дат, то можно увидеть, что некоторые из них отсутствуют. Всё потому, что с 5/10 по 7/10 не было совершено ни одного платежа, и запрос не смог ничего сгруппировать в эти дни. Аналогично и для периода с 11/10 по 14/10.

Такие графики вводят пользователя в заблуждение, потому что не всегда можно заметить отсутствующие даты. Чаще всего это происходит, когда пользователь применяет много фильтров, условиям которых соответствует малое количество данных. Поэтому лучше использовать generate_series() при сохранении запроса на дашборд, а уже затем применять фильтры.

generate_series для дат

generate _series(start, stop, step) – это функция, возвращающая множество строк и принимающая два обязательных аргумента start и stop, и один опциональный – step.

Самый простой пример такой функции, возвращающей список чисел от 1 до 5:

select generate_series(15)

Функция generate_series. Скриншот из демо devtodev

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

select generate_series(
ut(‘2021-10-01’)
, ut(‘2021-10-14’)
, ‘1 day’::interval)::date as days

Функция generate_series. Скриншот из демо devtodev

Данный запрос вернул нам все даты, находящиеся от ut(‘2021-10-01’) до ut(‘2021-10-14’) с интервалом в один день – ‘1 day’::interval.

Другие примеры генерации дат и времени:

  • 5-минутные интервалы: select generate_series(ut(‘2021-10-01’), ut(‘2021-10-14’), ‘5 min’::interval)::timestamp
  • 1-часовые интервалы: select generate_series(ut(‘2021-10-01’), ut(‘2021-10-14’), ‘1 hour’::interval)::timestamp
  • 1-дневные интервалы: select generate_series(ut(‘2021-10-01’), ut(‘2021-10-14’), ‘1 day’::interval)::date
  • Недельные интервалы (Обратите внимание на использование функции date_trunc в качестве start и stop аргумента. Это сделано для того, чтобы сгенерированные недели всегда начинались с понедельника, независимо от дня недели current_date)select generate_series(date_trunc(‘week’,current_date-interval ‘2 week’), date_trunc(‘week’,current_date), ‘1 week’::interval)::date
  • Месячные интервалы: select generate_series(date_trunc(‘month’, current_date-interval ‘3 month’), date_trunc(‘month’,current_date), ‘1 month’::interval)::date

Заполнение пустых дат в графике

Чтобы использовать generate_series() в нашем запросе, мы отдельно запишем генерацию дат в CTE (Common Table Expression). Затем, с помощью left join, к сгенерированному списку дат добавим таблицу с рассчитанными данными в начале статьи:

with generated_days as (
select generate_series(ut(‘2021-10-01’), ut(‘2021-10-10’), ‘1 day’::interval)::date as days
)
select days, «Payments count by users from Italy»
from generated_days
left join (
select eventtime :: date as days
, count() as «Payments count by users from Italy»
from p102968. payments
where eventtime > current_date — interval ’14 day’and eventtime < date_trunc (‘day’, current_date)
and country = ‘IT’
group by 1
) t using (days)
order by 1

Результат запроса. Скриншот из демо devtodev

Конечно, теперь график не такой красивый – у него есть пустые, незаполненные значения для некоторых дней. Однако такой график гораздо правдивее.

Если вы хотите улучшить его вид, можете использовать функцию coalesce() и проставить значение «0» для незаполненных полей. 

Результат:

select days, coalesce(«Payments count by users from Italy»,0)

Читайте также: SQL для начинающих: вложенные запросы и временные таблицы

Построение гистограммы распределения ARPPU

Теперь проанализируем ARPPU – средний доход от одного платящего пользователя.   Попробуем понять, какие суммы мы получаем от платящих пользователей, и как их можно сегментировать по «малькам» и «китам». 

Считаем ARPPU пользователей:

select devtodevid, sum(priceusd):: int ARPPU
from p102968.payments
where created between current_date — interval ‘2 month’ and current_date — interval ‘1 month’and eventtime — created < interval ‘1 month’
group by 1
order by 2 desc

Результат запроса. Скриншот из демо devtodev

В условии where мы использовали eventtime — created < interval ‘1 month’, что возвращает только совершенные в течение месяца после установки платежи. Таким образом все пользователи будут в равных условиях. Также мы привели все суммы платежей пользователей к целочисленному значению sum(priceusd)::int ARPPU.

Теперь сформируем интервалы для гистограммы. Мы можем задать их сами, например, от 0 до 1000 с интервалом в 10 – generate_series(0, 1000, 10). Но зачем нам интервалы, в которых не будет ни одного пользователя? Давайте сгенерируем их в зависимости от получившихся значений ARPPU.

Читайте также: 4 способа сегментации платящих пользователей

Для этого расчет ARPPU помещаем в CTE ARPPU_table. Обращаемся к ней, генерируя интервал от 0 до максимального значения ARPPU – generate_series(0, max(ARPPU), 10) as f. Второй интервал t генерируется для ограничения интервала справа, чтобы сделать интервалы вида 0-10, 10-20. При этом t всегда будет больше значения на 10.

with ARPPU_table as (
select devtodevid, sum (priceusd):: int ARPPU
from p102968.payments
where created between current_date — interval ‘2 month’ and current_date — interval ‘1 month’and eventtime — created < interval ‘1 month’
group by 1
order by 2 desc
)
, intervals as (
select generate_series(0, max(ARPPU), 10) as f
, generate_series(10, max(ARPPU)+1010) as t
from ARPPU_table
)

Таблица intervals будет содержать следующие значения до максимально подсчитанного значения ARPPU: 

Результат запроса.  Скриншот из демо devtodev

Осталось объединить данные запросов. Для этого выбираем данные из таблицы intervals, присоединяем к ней таблицу ARPPU_table с помощью left join таким образом, чтобы каждый пользователь из ARPPU_table попал в собственную строку со значением ARPPU>=f and ARPPU <t. В select, для читаемости, мы объединили f и t через конкатенацию, в результате чего интервалы стали выглядеть как $0 — $10, $10 — $20 и т.д.

select ‘$’ || f || ‘- $’ || t as intervals, count() as «Users count»
from intervals
left join ARPPU_table on ARPPU >= f and ARPPU < t
group by f,t
order by f

Результат запроса. Скриншот из демо devtodev

Наглядно видно, как распределяются суммы платежей пользователей, и можно предположить, что «мальками» для данного приложения будут пользователи, платящие $0 — $10, «дельфины» платят $10 — $50, «киты» – $50 — $100 и т. д.

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

6 функций для получения дня, месяца и года по дате в SQL Server

Transact-SQL включает набор функций, которые помогают нам работать с датами и временем. Одной из наиболее распространенных задач при работе с датами является извлечение различных частей даты. Например, иногда нам нужен только год или месяц. В других случаях нам может понадобиться день недели. В любом случае, в SQL Server существует множество способов сделать это.

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

  • ДЕНЬ() , МЕСЯЦ() и ГОД()
  • ЧАСТЬ ДАТЫ()
  • ДАТАИМЯ()
  • ФОРМАТ()

Эти функции описаны ниже.

Функции DAY(), MONTH() и YEAR()

Самый очевидный способ вернуть день, месяц и год из даты — использовать одноименные функции T-SQL. Да, в T-SQL есть функции, созданные специально для возврата этих трех частей даты.

Вот пример их работы:

 DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
ВЫБРАТЬ
    ДЕНЬ(@дата) КАК ДЕНЬ,
    МЕСЯЦ(@дата) КАК МЕСЯЦ,
    ГОД(@дата) КАК ГОД;
 

Результат:

 +-------+---------+--------+
| ДЕНЬ | МЕСЯЦ | ГОД |
|-------+---------+--------|
| 2 | 6 | 2018 |
+-------+---------+--------+
 

Эти функции возвращают дату в виде целого числа. Они возвращают тот же результат, что и функция DATEPART() 9.Функция 0009 возвращает значение для указанной части даты.

Функция DATEPART()

Функция DATEPART() была создана специально для возврата определенных частей даты. Таким образом, мы можем использовать эту функцию для возврата точно такого же результата, как и в предыдущем примере:

 DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
ВЫБРАТЬ
    DATEPART(день, @date) КАК ДЕНЬ,
    DATEPART(день недели, @date) AS WEEKDAY,
    DATEPART(месяц, @дата) КАК МЕСЯЦ,
    DATEPART(год, @дата) AS YEAR;
 

Результат:

 +-------+-----------+---------+--------+
| ДЕНЬ | ДЕНЬ НЕДЕЛИ | МЕСЯЦ | ГОД |
|-------+-----------+----------+--------|
| 2 | 7 | 6 | 2018 |
+-------+-----------+----------+--------+
 

Одним из преимуществ использования этой функции является возможность возврата других частей даты и времени. Как вы можете видеть в этом примере, я вернул день недели, а также день ( день — день месяца, день недели — день недели). Вы также можете вернуть различные части времени, такие как минуты, секунды, миллисекунды и т. д. Дополнительные примеры см. в разделе 9.0008 DATEPART() Примеры в SQL Server.

Функция DATEPART() возвращает результат в виде целого числа, поэтому по дате нельзя получить название месяца или дня недели. Но не беспокойтесь, вы можете использовать для этого функции DATENAME() или FORMAT() .

Функция DATENAME()

Функция DATENAME() аналогична функции DATEPART() , за исключением того, что она возвращает результат в виде строки символов вместо целого числа. DATENAME() также возвращает месяц и день недели как их полное название, а не их числовое значение.

Пример:

 DECLARE @date datetime2 = '2018-06-02 08:24:14. 3112042';
ВЫБРАТЬ
    DATENAME(день, @date) КАК ДЕНЬ,
    DATENAME(день недели, @date) AS WEEKDAY,
    DATENAME(месяц, @дата) КАК МЕСЯЦ,
    DATENAME(year, @date) AS YEAR;
 

Результат:

 +-------+-----------+---------+--------+
| ДЕНЬ | ДЕНЬ НЕДЕЛИ | МЕСЯЦ | ГОД |
|-------+-----------+----------+--------|
| 2 | Суббота | июнь | 2018 |
+-------+-----------+----------+--------+
 

Дополнительные примеры этой функции см. в разделе DATENAME() Примеры в SQL Server.

Функция FORMAT()

Мы можем использовать функцию FORMAT() для возврата тех же значений, что и функция DATENAME() , и многое другое.

Это более универсальная функция, чем предыдущие. Он позволяет форматировать дату/время, а также числовые значения в виде строк. Возвращаемое значение: nvarchar или null (в зависимости от ввода), а длина строки определяется указанным форматом.

FORMAT() также предоставляет больше возможностей для представления даты. Вы можете указать, отображать ли его как один символ, два символа, три, четыре и даже пять в некоторых случаях.

Вот примеры для демонстрации.

День

 DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
ВЫБРАТЬ
    ФОРМАТ(@date, 'd') КАК d,
    ФОРМАТ(@дата, 'дд') КАК дд,
    ФОРМАТ(@date, 'ddd') КАК ddd,
    ФОРМАТ(@date, 'dddd') КАК dddd;
 

Результат:

 +-----+------+-------+----------+
| д | дд | ддд | дддд |
|-----+------+-------+----------|
| 2 | 02 | Сб | Суббота |
+-----+------+-------+----------+
 

Месяц

 DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
ВЫБРАТЬ
    ФОРМАТ(@date, 'M') КАК M,
    ФОРМАТ(@дата, 'ММ') КАК ММ,
    ФОРМАТ(@date, 'МММ') КАК МММ,
    FORMAT(@date, 'МММММ') AS MMMM;
 

Результат:

 +-----+------+-------+--------+
| М | мм | МММ | ММММ |
|-----+------+-------+--------|
| 6 | 06 | июнь | июнь |
+-----+------+-------+--------+
 

Год

 DECLARE @date datetime2 = '2018-06-02 08:24:14. 3112042';
ВЫБРАТЬ
    FORMAT(@date, 'y') AS y,
    FORMAT(@date, 'yy') AS yy,
    FORMAT(@date, 'yyy') AS yyy,
    FORMAT(@date, 'yyyy') AS yyyy,
    FORMAT(@date, 'yyyyy') AS yyyyy;
 

Результат:

 +-----+------+-------+--------+---------+
| у | гг | ггг | гггг | гггг |
|-----+------+-------+---------+---------|
| 18 | 18 | 2018 | 2018 | 02018 |
+-----+------+-------+--------+---------+
 

Обратите внимание, что у нас есть возможность отформатировать часть года как пять цифр.

О количестве цифр

При возврате части даты в цифровом виде описатель формата определяет минимальное количество возвращаемых цифр. Например, при использовании  yyy год будет возвращен в виде трех цифр, если год равен 0008 , и в виде четырех цифр, если год равен 2008 .

Пример:

 DECLARE @date datetime2 = '0008-06-02 08:24:14.3112042';
ВЫБРАТЬ
    FORMAT(@date, 'y') AS y,
    FORMAT(@date, 'yy') AS yy,
    FORMAT(@date, 'yyy') AS yyy,
    FORMAT(@date, 'yyyy') AS yyyy,
    FORMAT(@date, 'yyyyy') AS yyyyy;
 

Результат:

 +-----+------+-------+--------+---------+
| у | гг | ггг | гггг | гггг |
|-----+------+-------+---------+---------|
| 8 | 08 | 008 | 0008 | 00008 |
+-----+------+-------+--------+---------+
 

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

Пример:

 DECLARE @date datetime2 = '2008-06-02 08:24:14.3112042';
ВЫБРАТЬ
    FORMAT(@date, 'd') AS 'Space',
    FORMAT(@date, 'd') AS 'Без пробела',
    FORMAT(@date, 'M') AS 'Space',
    FORMAT(@date, 'M') AS 'Без пробела',
    FORMAT(@date, 'y') AS 'Space',
    FORMAT(@date, 'y') AS 'Без пробела';
 

Результат:

 +---------+-------------+---------+---------- --+---------+-------------+
| Космос | Нет места | Космос | Нет места | Космос | Нет места |
|---------+------------+---------+------------+--- ------+------------|
| 2 | 02.06.2008 | 6 | 2 июня | 8 | июнь 2008 г. |
+---------+------------+---------+------------+--- ------+------------+
 

Дополнительные примеры FORMAT() см. в разделе Форматирование даты и времени в SQL Server.

Как найти первый и последний день месяца с помощью функций даты Oracle SQL | Джошуа Отвелл

Я постоянно совершенствую свои навыки и знания в области SQL. Имея базовые знания о MySQL, с умеренным или интенсивным использованием (и некоторые с PostgreSQL), я некоторое время смотрел на базу данных Oracle.

Oracle SQL раньше казался менее доступным мне. Я пользователь Linux и обнаружил, что в зависимости от того, какой дистрибутив вы используете, установка Oracle SQL — XE Edition — может быть easy-peasy или может быть meh… (по крайней мере, таков был мой опыт .)

Однако в наши дни существует всегда бесплатная автономная база данных Oracle, размещенная на OCI, для которой я недавно зарегистрировал учетную запись.

Имея доступ к 2 бесплатным автономным базам данных Oracle по 20 ГБ, я начал свой путь к изучению базы данных Oracle SQL с конечной целью стать сертифицированным разработчиком Oracle SQL, что было моей целью в течение некоторого времени.

Image by 200 Degrees from Pixabay

Недавно я написал сообщение в блоге MySQL Count Weekday Occurrences, в котором перенес более некоторых концепций функциональности Oracle SQL и Date (вдохновленных этим видео на YouTube) для сопоставимых запросов MySQL. В этом посте я расскажу о небольшом подмножестве функций даты, присутствующих в Oracle SQL, как я понимаю, с целью определения первого и последнего дня данного месяца. (Примеры в этом сообщении относятся к текущему месяцу на момент написания: апрель 2021 г.).

Функции даты Oracle SQL

Ниже приведены 4 функции даты, которые я буду использовать для следующих примеров запросов:

  • SYSDATE — Предоставляет текущую дату и время ОС (операционной системы), база данных Oracle запущена/установлена. на. (Примечание: SYSDATE не принимает никаких параметров.)
  • LAST_DAY()  — Возвращает последний день месяца для предоставленного параметра даты.
  • TRUNC()  —  Округляет значение даты в меньшую сторону до необязательно заданной модели формата (например, месяца, года и т. д.)
  • ADD_MONTHS() — Принимает 2 параметра: значение даты и число, представляющее месяцы. ADD_MONTHS() возвращает значение даты в результате добавления указанного количества месяцев к предоставленному параметру даты.

Первый и последний день текущего месяца

Поскольку SYSDATE предоставляет текущую дату и время, используя их в качестве параметра даты для функции TRUNC() , а модель формата MM (Месяц) возвращает первый день месяца, потому что TRUNC() округляет в меньшую сторону.

Первый день текущего месяца.

Передача SYSDATE в качестве параметра функции LAST_DAY() возвращает последний день текущего месяца:

Последний день текущего месяца.

Ниже показаны первый и последний день текущего месяца (апрель 2021 г.) согласно SYSDATE . Эти значения можно использовать в дальнейшей обработке данных, если это необходимо (как я сделал в связанном посте, который я упоминал выше для порта MySQL поверх ).

И первый, и последний день текущего месяца на момент написания.

Первый и последний день следующего месяца

Используя возвращенные результаты запроса, которые у нас есть сейчас, немного поработав, и другую функцию Oracle SQL Date — ADD_MONTHS() — очень легко определить, какой первый и последний месяц следующего месяца значения последнего дня. Просто передав число 1 в качестве количества месяцев в ADD_MONTHS() с вызовом TRUNC(SYSDATE, ‘MM’) в качестве DATE 9Параметр 0009 value возвращает первый день следующего (или следующего) месяца, 01-MAY-21 :

Первый день следующего месяца.

Использование ADD_MONTHS(TRUNC(SYSDATE, 'MM), 1) в качестве параметра значения DATE функции LAST_DAY() также возвращает последний день следующего месяца:

Последний день следующего месяца

Первый и последний день предыдущего месяца

Как я узнал из книги/руководства по Oracle SQL, которое я читаю, нет SUBTRACT_MONTHS() Функция DATE в Oracle SQL. Однако вы можете использовать отрицательное число в качестве второго параметра для ADD_MONTHS() , и это количество месяцев будет вычтено из значения первого параметра DATE .

Например, используя -1, вы можете абсолютно точно определить значения первого и последнего дня предыдущего месяца в соответствии с SYSDATE возвращает значение DATE :

Первый день предыдущего месяца.

Чтобы вычислить последний день предыдущего месяца, оберните все выражение, ADD_MONTHS(TRUNC(SYSDATE, ‘MM’), -1) , как параметр DATE в вызове функции LAST_DAY() :

Последний день предыдущего месяца.

Я надеюсь, что с помощью примеров запросов в этом посте вы лучше поймете, насколько просто получить значения первого и последнего дня месяца с помощью функций Oracle SQL Date.

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

Спасибо, что прочитали. 👍👏🤘

Понравилось содержание, которое вы прочитали в этом посте? Тогда вам наверняка понравятся записи в моем блоге Digital Owl’s Prose.

Здесь вы найдете сообщения в блогах о разработке/программировании баз данных SQL и разработке веб-стека LAMP.

Спасибо, что являетесь частью нашего сообщества! Level Up трансформирует рекрутинг в сфере технологий. Найдите свою идеальную работу в лучших компаниях .

Повышение уровня — трансформация процесса найма

🔥 Предоставление инженерам-программистам возможности найти идеальную роль, которую они любят 🧠 Поиск талантов — самая болезненная часть…

jobs.levelup.dev

Расширенный SQL-запрос: как получить номер недели месяца из даты в SQL | Риза Пурнарамадан | Analytics Vidhya

В сопровождении бизнес-кейса

Фото Бехнама Норузи на Unsplash

Обсуждение основ уроков SQL-запросов, возможно, очень много обсуждалось людьми, таких как операторы SELECT, GROUPING, JOIN и так далее. Поэтому здесь я намерен обсудить то, что редко обсуждается и, возможно, редко встречается, а именно, как получить номер недели месяца из даты в SQL. Я часто использую этот запрос в своей работе в качестве аналитика данных для решения бизнес-задач.

  1. Бизнес-задача
  2. Работа с функцией EXTRACT с даты
  3. Изменение с помощью подзапроса и оператора CASE

Бизнес-проблема

Бизнес-проблема в настоящее время, например, в бизнесе, занимающемся розничной торговлей, мы попросил руководителя узнать объем продаж каждого продукта в неделю из каждого месяца, но количество недель рассчитывается не из дня, а из числа даты, поэтому 1-7 - это первая неделя, хотя 1-й не начинается в понедельник. Как решить вышеуказанные бизнес-проблемы с помощью SQL? Давайте обсудим это в следующем разделе!. Результат, который мы ожидаем, выглядит примерно так:

Работа с функцией ИЗВЛЕЧЬ по дате

На самом деле функция ИЗВЛЕЧИТЬ из даты, которую мы используем чаще всего, предназначена для извлечения таких полей, как год, месяц, неделя и день, из значения даты/времени. Прежде чем двигаться дальше, давайте рассмотрим использование функции EXTRACT в часто используемых полях. Скачать данные можно здесь .

Давайте посмотрим на весь столбец и первые 5 данных:

 SELECT * FROM sample 
LIMIT 5

Вот результат:

  • Год извлечения из order_date Столбец
 SELECT ORDER_DATE, EXTRACT (год от ORDER_DATE). В качестве года от образца 

Вот результат:

. полученная дата.

  • Извлечение месяца из order_date столбец
 SELECT order_date, EXTRACT(MONTH FROM order_date) AS month FROM sample 

Вот результат:

Функция МЕСЯЦ вернет месячную часть указанной даты (от числа 1 до 12).

  • Неделя извлечения от order_date Колонка
 SELECT ORDER_DATE, EXTRACT (Week с ORDER_DATE), как и неделя из образца 

Вот результат:

. указанная дата (от числа 0 до 53).

  • Извлечение дня из order_date столбец
 SELECT order_date, EXTRACT(DAY FROM order_date) AS day FROM sample 

Вот результат:

Функция DAY вернет число дней 9 0 заданная дата (от числа 1 до 31).

Теперь давайте посмотрим на получение номера недели. При взятии номера недели в основном берется номер недели с начала года (согласно расчету по григорианскому календарю), так что при выборе даты 2021–04–01 будет возвращен номер недели 13.

Тогда как получить номер недели, но из месяца в определенный день, но не привязанный к григорианскому календарю? поэтому мы по-прежнему считаем дату 1–7 первой неделей, хотя 1-е число не начинается в понедельник. До сих пор я никогда не находил функцию/команду из SQL, которая могла бы вернуть этот результат, поэтому нам нужно подумать о том, как изменить синтаксис, чтобы получить этот результат с помощью доступных функций/команд в SQL, это может показаться сложным, но на самом деле это легко, давайте обсудим в следующем разделе!

Изменение с помощью подзапроса и оператора CASE

Чтобы получить результат, который мы ожидаем, как и в разделе бизнес-проблем, нам нужно использовать метод подзапроса и несколько операторов CASE. Нам нужно сделать 2 шага, а именно:

Итак, сначала нам нужно создать синтаксис, в котором синтаксис выполняет SELECT для всех столбцов, кроме столбца customer_id, а затем берет день и месяц из столбца order_date, здесь это синтаксис:

1. Итак, что нам нужно сделать в первую очередь, это создать синтаксис, где синтаксис выполняет SELECT для всех столбцов, кроме customer_id столбец, а затем берет день и месяц из столбца order_date , вот синтаксис:

 ВЫБЕРИТЕ product_name, 
количество,
order_date,
EXTRACT(DAY FROM order_date) AS day,
EXTRACT(MONTH FROM order_date ) AS month
FROM sample

Вот результат:

2. Во-вторых, мы создаем подзапрос с предыдущим синтаксисом, который содержит и извлекает:

  • product_name столбец
  • Агрегатная функция SUM для amount_total столбец
  • CASE оператор путем извлечения столбца дня для создания второго столбца Week_of_month с извлечением первого условия – дата 7, первое условие извлечения 7 дата 8–14, третье условие извлекает дату 15–21, а четвертое условие — остаток.
  • месяц столбец

Затем в конце синтаксиса мы используем GROUP BY заявление для столбцов product_name , количество , Week_of_month , dan month . Полный синтаксис выглядит следующим образом:

 SELECT имя_продукта, 
СУММА(количество) КАК количество_общее,
CASE
WHEN день < 8 THEN 'Неделя 1'
WHEN день < 15 THEN 'Неделя 2'
WHEN день < 22 THEN 'Неделя 3'
ELSE 'Неделя 4'
END AS неделя_из_месяца,
месяц
FROM
(ВЫБЕРИТЕ product_name, количество, order_date, EXTRACT(DAY FROM order_date) AS day,
ВЫДЕРЖКА(МЕСЯЦ ИЗ дата_заказа) КАК месяц
ИЗ пробы) a
СГРУППИРОВАТЬ ПО продукт_название, количество, неделя_месяца, месяц

Вот результат:

Ага! Из приведенных выше результатов мы можем получить ожидаемые результаты.

До сих пор нам удавалось решать бизнес-задачи, используя творческие идеи Подзапросы и операторы CASE, поскольку у нас есть творческие идеи о запросах, вещи, которые кажутся сложными, станут легкими, продолжайте практиковаться!

ИЗВЛЕЧЬ компоненты из даты или времени в MySQL, Oracle, PostgreSQL и т.

д.

Экстракт SQL обеспечивает доступ к компонентам временных типов данных, т.е. дата , время , метка времени и интервал .

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

 EXTRACT( FROM ) 

Имена полей также являются ключевыми словами SQL — их нельзя заключать в двойные или одинарные кавычки.

Экстракт SQL возвращает точное числовое значение. Для секунд оно также включает дроби.0 В следующей таблице перечислены поля извлечения , определенные стандартом SQL.

Meaning extract field
Year YEAR
Month MONTH
Day of month DAY
24 hour HOUR
Minute MINUTE
Seconds (including fractions) SECOND
Time zone hour TIMEZONE_HOUR
Time zone minute TIMEZONE_MINUTE

Извлечь можно только из отдельных полей. Для извлечения полной даты (год, месяц, день) или времени (час, минута, секунда) из timestamp , cast можно использовать:1

 CAST( AS [DATE|TIME]) 

Это особенно полезно для предложения group by . В пункте , где , это часто неправильный выбор. Подробнее об этом см. в разделе «Ненадлежащее использование в статье , где » ниже.

Внимание! База данных Oracle

База данных Oracle не имеет предопределенного типа даты без компонентов времени. Даже оракул типа date имеет компонент времени — в этом отношении Oracle date больше похож на стандартную временную метку .2 Преобразование типа ( cast ) в date поэтому не удаляет компонент времени в базе данных Oracle.

Чтобы использовать только дату — без компонентов времени — общепринятой практикой является использование собственной функции trunc для установки всех полей времени в ноль ( 0 ):

 trunc() 

Обратите внимание, что В результате по-прежнему присутствуют компоненты времени — они просто обнуляются. Эффект в основном похож на следующие приведение выражения в стандартном SQL:

 CAST(CAST( AS DATE) AS TIMESTAMP) 

Совместимость

Извлечение SQL было доступно в SQL-92 (промежуточном) и теперь является частью дополнительной функции F052 , «Интервалы и арифметика даты и времени». Несмотря на свою зрелость и актуальность, экстракт до сих пор не поддерживается всеми основными базами данных.

BigQueryaDb2 (LUW)bdMariaDBcdMySQLcdOracle DBePostgreSQLSQL ServerdSQLitedfgextract(… from )extract(… from )cast( as date)cast( as time)
  1. Нет полей часового пояса • СЕКУНДА не включает дроби
  2. Нет полей часового пояса
  3. Нет полей часового пояса • СЕКУНД не включает дроби. Используйте Second_microsecond
  4. Не поддерживает тип данных Интервал
  5. См. «Осторожность: база данных Oracle» выше
  6. Используйте Дата (<<<) вместо
  7. Использование Время (<<<<<<<<<<<3)) вместо
  8. .

Связанные антишаблоны

Функции форматирования строк

Очень распространенным антишаблоном является использование функций форматирования строк (например, to_char ) вместо Extract для получения отдельных полей даты или времени. Эти строковые функции часто применяют непреднамеренное форматирование, такое как начальные пробелы или нули, или запятая (, ) вместо точки (. ) в качестве десятичного знака в зависимости от текущей локали.

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

Недопустимое использование в

Where Пункт

Рассмотрим следующий анти-шаблон:

 WHERE EXTRACT(YEAR FROM some_date) = 2016 

временное ограничение. На самом деле это важная и желательная цель, потому что определение «последнего момента» на самом деле невозможно :

Единицы времени неодинаковы

Хорошо известно, что продолжительность месяца не униформа. Правила для високосных лет известны хотя бы частично. Просто учитывая эти факты, любой «последний момент» может быть определен алгоритмически.

Но есть и високосные секунды, которые нерегулярны. Они вставляются время от времени по требованию. Например, последняя секунда UTC в 2016 году была 23:59:60. Если вы считаете, что день заканчивается в 23:59:59 UTC, вы можете пропустить целую секунду. чем на шесть месяцев вперед — невозможно сказать последний момент месяца более чем на шесть месяцев вперед.

В дополнение к этому более или менее теоретическому частному случаю также хорошо избежать необходимости указывать «последний момент», потому что его довольно неудобно вычислять.

Разрешение компонента времени неизвестно (по крайней мере, в будущем)

Даже если вы правильно определили последний день и последнюю секунду периода, вам может потребоваться включить достаточное количество дробных цифр, чтобы указать «последний момент» периода. Если вы знаете, что тип соответствующего столбца не допускает использования дробей (например, timestamp(0) ), вам не нужно учитывать никакие дроби прямо сейчас . Но если позже тип будет изменен на timestamp(6) , скорее всего, предположения о «последнем моменте» не будут обновлены.

Поэтому рекомендуется избегать использования «последнего момента». Использование extract , cast или функций форматирования строк — просто неверный подход к достижению этой цели.

От своего имени

Я зарабатываю на жизнь обучением SQL, настройкой и консультированием SQL, а также своей книгой «Объяснение производительности SQL». Узнайте больше на https://winand.at/.

Следующее предложение , где , эквивалентно приведенному выше примеру извлечения и по-прежнему не указывает «последний момент» 2016 года:

 WHERE some_date >= DATE'2016-01-01'
  AND some_date < DATE'2017-01-01' 

Обратите внимание на шаблон: используйте включающее сравнение ( >= ) для нижней границы и исключающее сравнение ( < ) для верхней границы. Следовательно, вам нужно указать первый момент исключил из результата в качестве верхней границы. Шаблон «включающий/исключительный» позволяет избежать необходимости указывать «последний момент» соответствующего временного интервала, используя дважды менее хлопотный «первый момент».

Обратите внимание, что SQL между не может использоваться для этого шаблона, поскольку между включает оба граничных значения.

По сравнению с решением выдержка условие включения/исключения имеет два преимущества:

Работает для произвольных временных рамок

Вы можете легко выбрать один месяц, день и т. д., даже если они не соответствуют календарю. Подумайте, как бы вы реализовали следующий пример, используя extract , to_char или что-то подобное:4

 WHERE some_date >= DATE'1994-03-11'
  AND some_date < DATE'1995-03-11' 
Он может использовать индекс для столбца даты/времени

Индекс для some_date в основном бесполезен, если где 9Предложение 0009 оборачивает индексированные столбцы с помощью функции или выражения, такого как Extract . 5 Такой индекс можно использовать в явном шаблоне включения/исключения. Узнайте больше об использовании индексации по адресу Используйте индекс, Люк!

Собственные расширения: Дополнительные поля

Некоторые базы данных поддерживают дополнительные извлечения полей. В следующей таблице приведены наиболее распространенные проприетарные поля Extract . Обратите внимание, что это проприетарные расширения: они могут вести себя по-разному в разных продуктах. Поле неделя , например, работает в трех проверенных базах данных, но возвращает разные результаты для каждой из них.

BigQueryacfgDb2 (LUW)adhiMariaDBegMySQLegOracle DBPostgreSQLbfSQL ServerSQLitequarterdoydayofyeardowdayofweekweekisoweekmicrosecondepoch
  1. Sunday = 1
  2. Sunday = 0
  3. Sunday-based weeks with first Sunday in year • Use extract(isoyear) for the corresponding year
  4. ISO 8601 week date (year's first четверг)
  5. Недели, основанные на воскресеньях, с первым воскресеньем года
  6. Дата недели ISO 8601 (первый четверг года) • Используйте выдержка (isoyear) для соответствующего года
  7. Включает секунды: 12. 3456789 секунд возвращается как 123456789
  8. секунды
  9. Включая дроби

Собственные альтернативы

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

BigQueryDb2 (LUW)MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLitedatepartstrftimeextract(second_microsecond …)

datepart : SQL Server

Microsoft SQL Server предлагает собственную функцию datepart . Следующий пример эквивалентен экстракту (год от ) .

 DATEPART(год, <дата-время>) 

Тип возвращаемого значения всегда целое число. Доли секунд могут быть получены в виде отдельных полей (например, миллисекунд ).

Следующее выражение ведет себя как extract(second from ) с до девяти дробных цифр:

 DATEPART(second , )
+ CAST(DATEPART(наносекунда, <дата/время>)
    КАК ЦИФРОВОЙ (9,0)
      )/power(10,9) 

Полный список доступных полей см. в разделе «DATEPART (Transact-SQL)».

strftime — SQLite

SQLite предлагает функцию strftime для форматирования даты и времени в виде строк.6 Чтобы извлечь один компонент, просто отформатируйте этот компонент и приведите к числовому типу, если это необходимо. Следующий пример эквивалентен экстракту (год от ) .

 CAST(STRFTIME ('%Y', ) AS NUMERIC) 

Обратите внимание, что строка формата '%S' (для секунд) не включает дроби. Вместо этого используйте '%f' (секунды, включая три дробные цифры):

 CAST(STRFTIME ('%f', ) AS NUMERIC) 

Извлечение MySQL и 9 MariaDB0008 Extract всегда возвращают целочисленные значения. Чтобы получить секунды с дробями, используйте проприетарное поле second_microsecond extract :

 EXTRACT(second_microsecond FROM )/power(10,6) 

Spark SQL Date and Timestamp Functions в стандартной дате и метке времени (включая дату и время) Функции определяются в DataFrame API, они пригодятся, когда нам нужно выполнять операции с датой и временем.

Все они принимают ввод как тип даты, тип метки времени или строку. Если это строка, она должна быть в формате, который может быть приведен к дате, например гггг-ММ-дд и отметка времени в формате гггг-ММ-дд ЧЧ:мм:сс.SSSS и возвращает дату и отметку времени соответственно; также возвращает null, если входные данные представляют собой строку, которую нельзя привести к дате и отметке времени.

По возможности старайтесь использовать стандартную библиотеку, так как она немного более безопасна во время компиляции, обрабатывает null и работает лучше по сравнению со Spark UDF. Если производительность вашего приложения критична, старайтесь любой ценой избегать использования пользовательских UDF, поскольку они не гарантируют производительность.

Для удобства чтения я сгруппировал функции Date и Timestamp в следующие группы.

  • Функции даты Spark SQL 
  • Функции меток времени Spark SQL
  • Функции окна даты и меток времени

Прежде чем использовать приведенные ниже примеры, убедитесь, что вы создали сеанс sparksession и импортировали функции SQL.

импортировать org.apache.spark.sql.SparkSession
val spark:SparkSession = SparkSession.builder()
    .мастер("местный[3]")
    .appName("SparkByExample")
    .getOrCreate()
spark.sparkContext.setLogLevel("ОШИБКА")
импортировать spark.sqlContext.implicits._
импортировать org.apache.spark.sql.functions._
 

Функции даты Spark SQL

Нажмите на каждую ссылку в таблице ниже для получения дополнительных объяснений и рабочих примеров в Scala.

.
Дата Функция Подпись Дата Функция Описание
current_date () : Столбец Возвращает текущую дату в виде столбца даты.
date_format(dateExpr: Column, format: String): Column Преобразует дату/метку времени/строку в значение строки в формате, заданном форматом даты, заданным вторым аргументом.
to_date(e: Столбец): Столбец Преобразует столбец в `DateType` путем приведения правил к `DateType`.
to_date(e: Column, fmt: String): Column Преобразует столбец в `DateType` с указанным форматом
add_months(startDate: Column, numMonths: Int): Column Возвращает дату `numMonths` после `startDate`.
date_add (начало: столбец, дни: Int): столбец
date_sub(start: Column, days: Int): Column
Возвращает дату `дней` дней после `start`
datediff(end: Column, start: Column): Column Возвращает количество дней от `начала` до `конца`.
month_between(конец: столбец, начало: столбец): столбец Возвращает количество месяцев между датами «начало» и «конец». Целое число возвращается, если оба ввода имеют один и тот же день месяца или оба являются последним днем ​​соответствующих месяцев. В противном случае разница рассчитывается исходя из 31 дня в месяце.
month_between(end: Column, start: Column, roundOff: Boolean): Column Возвращает количество месяцев между датами `end` и `start`. Если для `roundOff` установлено значение true, результат округляется до 8 цифр; в противном случае он не округляется.
next_day(date: Column, dayOfWeek: String): Column Возвращает первую дату, более позднюю, чем значение столбца date, относящееся к указанному дню недели.
Например, `next_day('2015-07-27', "Воскресенье")` возвращает 2015-08-02, поскольку это первое воскресенье после 2015-07-27.
trunc(date: Column, format: String): Column Возвращает дату, усеченную до единиц, указанных форматом.
Например, `trunc("2018-11-19 12:01:19", "year")` возвращает формат 2018-01-01
: 'year', 'yyyy', 'yy' для усечения по году,
'месяц', 'пон', 'мм' для усечения по месяцу
date_trunc(format: String, timestamp: Column): Column Возвращает метку времени, усеченную до единиц, указанных форматом.
Например, `date_trunc("год", "2018-11-1912:01:19")` возвращает 2018-01-01 00:00:00 Формат
: 'год', 'гггг', 'гг' для усечения по годам,
'месяц', 'мон', 'мм' для усечения по месяцам,
«день», «дд» для усечения по дням,
Другие варианты: «секунды», «минуты», «часы», «неделя», «месяц», «квартал»
year(e: Столбец): Столбец Извлекает год как целое число из заданной даты/временной метки/строки
квартал(e: Столбец): Столбец Извлекает квартал как целое число из заданной даты/временной метки/строки.
month(e: Column): Столбец Извлекает месяц как целое число из заданной даты/временной метки/строки
dayofweek(e: Column): Column Извлекает день недели в виде целого числа из заданной даты/временной метки/строки. Варьируется от 1 для воскресенья до 7 для субботы
dayofmonth(e: Column): Column Извлекает день месяца в виде целого числа из заданной даты/временной метки/строки.
dayofyear(e: Column): Column Извлекает день года в виде целого числа из заданной даты/временной метки/строки.
weekofyear(e: Столбец): Столбец Извлекает номер недели в виде целого числа из заданной даты/временной метки/строки. Считается, что неделя начинается в понедельник, а неделя 1 — это первая неделя с более чем 3 днями, как определено в стандарте ISO 8601
last_day(e: Column): Column Возвращает последний день месяца, к которому относится данная дата. Например, ввод «2015-07-27» возвращает «2015-07-31», поскольку 31 июля — это последний день месяца в июле 2015 года.
from_unixtime(ut: Column): Column Преобразует количество секунд из эпохи unix (1970-01-01 00:00:00 UTC) в строку, представляющую отметку времени этого момента в текущем системном часовом поясе в формате гггг-ММ-дд ЧЧ:мм:сс.
from_unixtime(ut: Column, f: String): Column Преобразует количество секунд из эпохи unix (1970-01-01 00:00:00 UTC) в строку, представляющую отметку времени этого момента в текущем системный часовой пояс в заданном формате.
unix_timestamp(): Столбец Возвращает текущую метку времени Unix (в секундах) в виде длинного
unix_timestamp(s: Column): Column Преобразует строку времени в формате гггг-ММ-дд ЧЧ:мм:сс в метку времени Unix (в секундах), используя часовой пояс по умолчанию и языковой стандарт по умолчанию.
unix_timestamp(s: Column, p: String): Column Преобразует строку времени с заданным шаблоном в метку времени Unix (в секундах).

Функции временной метки Spark SQL

Ниже приведены некоторые функции временной метки Spark SQL. Эти функции работают как со значениями даты, так и со значениями временной метки. Выберите каждую ссылку для описания и примера каждой функции.

Формат по умолчанию для метки времени Spark: гггг-ММ-дд ЧЧ:мм:сс.SSSS

Функции окна даты и метки времени Spark

Ниже приведены функции окна данных и метки времени.

.
Синтаксис функции окна даты и времени Функция окна даты и времени Описание
window(timeColumn: Column, windowDuration: String,
slideDuration: String, startTime: String): Column
Разделить строки на одно или несколько временных окон с заданной меткой времени, указывающей столбец. Начало окна включено, но конец окна является исключительным, например. 12:05 будет в окне [12:05,12:10), но не в [12:00,12:05). Windows может поддерживать микросекундную точность. Окна порядка месяцев не поддерживаются.
window(timeColumn: Column, windowDuration: String, slideDuration: String): Column Разделить строки на одно или несколько временных окон с заданной меткой времени, указывающей столбец. Начало окна включено, но конец окна является исключительным, например. 12:05 будет в окне [12:05,12:10), но не в [12:00,12:05). Windows может поддерживать микросекундную точность. Окна порядка месяцев не поддерживаются. Окна начинаются с 1970-01-01 00:00:00 UTC
window(timeColumn: Column, windowDuration: String): Column Генерирует переворачивающиеся окна времени с заданной меткой времени, указывающей столбец. Начало окна включено, но конец окна является исключительным, например. 12:05 будет в окне [12:05,12:10), но не в [12:00,12:05). Windows может поддерживать микросекундную точность. Окна порядка месяцев не поддерживаются. Окна начинаются с 1970-01-01 00:00:00 UTC.

Функции Spark Date Примеры

Ниже приведены наиболее часто используемые примеры функций даты.

current_date() и date_format()

Мы увидим, как получить текущую дату и преобразовать дату в определенный формат даты, используя date_format() на примере Scala. В приведенном ниже примере анализируется дата и преобразуется из формата «гггг-дд-мм» в формат «ММ-дд-гггг».

импортировать org.apache.spark.sql.functions._
Посл(("2019-01-23"))
  .toDF("Ввод")
  .Выбрать(
    текущая_дата () как («текущая_дата»),
    столбец ("Ввод"),
    date_format(col("Ввод"), "ММ-дд-гггг").as("формат")
  ).показывать()
 
+------------+-----------+-----------+
|текущая_дата| Вход |формат |
+------------+-----------+-----------+
| 2019-07-23 |2019-01-23| 23-01-2019 |
 +------------+-----------+-----------+
 

to_date()

В приведенном ниже примере строка в формате даты «ММ/дд/гггг» преобразуется в тип даты «гггг-ММ-дд» с использованием to_date() на примере Scala.

импортировать org.apache.spark.sql.functions._
Посл(("13.04.2019"))
   . toDF("Ввод")
  .выбрать(столбец("Ввод"),
           to_date(col("Ввод"), "MM/dd/yyyy").as("to_date")
   ).показывать()
 
+----------+----------+
|Введите |до_даты |
+----------+----------+
|13.04.2019|13.04.2019|
+----------+----------+
 

datediff()

Пример ниже возвращает разницу между двумя датами, используя datediff() с примером Scala.

импортировать org.apache.spark.sql.functions._
Seq(("2019-01-23"),("2019-06-24"),("2019-09-20"))
   .toDF ("ввод")
   .select(столбец("ввод"), current_date(),
       datediff(current_date(),col("ввод")).as("diff")
    ).показывать()
 
+----------+---------------+--------+
| ввод |current_date()| разница |
+----------+---------------+--------+
|2019-01-23| 2019-07-23 | 181 |
|2019-06-24| 2019-07-23 | 29 |
|20.09.2019| 2019-07-23 | -59 |
+----------+---------------+--------+
 

months_between()

Пример ниже возвращает количество месяцев между двумя датами, используя months_between() на языке Scala.

импортировать org.apache.spark.sql.functions._
Seq(("2019-01-23"),("2019-06-24"),("2019-09-20"))
   .toDF ("дата")
  .select(столбец("дата"), current_date(),
       datediff(current_date(),col("date")).as("datediff"),
       month_between(current_date(),col("дата")).as("months_between")
   ).показывать()
 
+----------+--------------+---------+-------------- +
| дата |current_date()|datediff|months_between|
+----------+--------------+---------+-------------- +
|2019-01-23| 2019-07-23 | 181| 6,0 |
|2019-06-24| 2019-07-23 | 29| 0,96774194|
|20.09.2019| 2019-07-23 | -59| -1,581|
+----------+--------------+---------+-------------- +
 

trunc()

Пример ниже усекает дату до указанной единицы с помощью trunc() на языке Scala.

импортировать org.apache.spark.sql.functions._
Seq(("2019-01-23"),("2019-06-24"),("2019-09-20"))
    .toDF ("ввод")
    .выбрать(столбец("ввод"),
          trunc(col("input"),"Month").as("Month_Trunc"),
          trunc (столбец («ввод»), «Год»).  как («Месяц_Год»),
          trunc(col("input"),"Month").as("Month_Trunc")
     ).показывать()
 
+----------+-----------+----------+-----------+
| ввод |Month_Trunc|Month_Year|Month_Trunc|
+----------+-----------+----------+-----------+
|2019-01-23| 01.01.2019|01.01.2019| 01.01.2019|
|2019-06-24| 01.06.2019|01.01.2019| 2019-06-01|
|20.09.2019| 01.09.2019|01.01.2019| 2019-09-01|
+----------+-----------+----------+-----------+
 

add_months() , date_add(), date_sub()

Здесь мы добавляем и вычитаем дату и месяц из заданного ввода.

импортировать org.apache.spark.sql.functions._
След(("2019-01-23"),("2019-06-24"),("2019-09-20")).toDF("ввод")
  .выбрать(столбец("ввод"),
      add_months(столбец("ввод"),3).as("добавить_месяцев"),
      add_months(col("ввод"),-3).as("sub_months"),
      date_add(столбец("вход"),4).as("date_add"),
      date_sub(столбец("ввод"),4).as("date_sub")
   ).показывать()
 
+----------+----------+-----------+----------+----- -----+
| введите |add_months|sub_months| дата_добавить | дата_суб |
+----------+----------+-----------+----------+----- -----+
|2019-01-23|2019-04-23|2018-10-23|2019-01-27|2019-01-19|
|2019-06-24|2019-09-24|2019-03-24|2019-06-28|2019-06-20|
|2019-09-20|2019-12-20|2019-06-20|2019-09-24|2019-09-16|
+----------+----------+-----------+----------+----- -----+
 

год(), месяц(), месяц()

день недели(), день месяца(), день года()

next_day(), неделя года()

импортировать org. apache.spark.sql.functions._
Seq(("2019-01-23"),("2019-06-24"),("2019-09-20"))
  .toDF ("ввод")
  .select(столбец("ввод"), год(столбец("ввод")).as("год"),
       месяц (столбец («ввод»)). как («месяц»),
       день недели(столбец("ввод")).as("день недели"),
       день месяца (столбец («ввод»)). as («день месяца»),
       день года (столбец («ввод»)). as («день года»),
       следующий_день(столбец("ввод"),"воскресенье").как("следующий_день"),
       неделя года (столбец («ввод»)). as («неделя года»)
   ).показывать()
 
+----------+----+-----+----------+----------+------ ---+----------+----------+
| ввод|год|месяц|деньнедели|деньмесяца|деньгода| следующий_день|неделягода|
+----------+----+-----+----------+----------+------ ---+----------+----------+
|2019-01-23|2019| 1| 4| 23| 23|2019-01-27| 4|
|2019-06-24|2019| 6| 2| 24| 175|2019-06-30| 26|
|20.09.2019|2019| 9| 6| 20| 263|2019-09-22| 38|
+----------+----+-----+----------+----------+------ ---+----------+----------+
 

Примеры функций метки времени Spark

Ниже приведены наиболее часто используемые примеры функций меток времени.

current_timestamp()

Возвращает текущую метку времени в формате Spark по умолчанию гггг-ММ-дд ЧЧ:мм:сс

импортировать org.apache.spark.sql.functions._
val df = Seq((1)).toDF("seq")
val curDate = df.withColumn("current_date",current_date().as("current_date"))
 .withColumn ("current_timestamp", current_timestamp(). as ("current_timestamp"))
curDate.show (ложь)
 

Выход ниже выходного.

+---+-------------+---------+
|seq|текущая_дата|текущая_временная метка |
+---+-------------+---------+
|1 |2019-11-16 |2019-11-16 21:00:55.349|
+---+-------------+---------+
 

to_timestamp()

Преобразует временную метку строки в формат типа Timestamp.

импортировать org.apache.spark.sql.functions._
  val dfDate = Seq(("01.07.2019 12 01 19 406"),
    ("24.06.2019 12 01 19 406"),
    («16.11.2019 16 44 55 406»),
    ("16.11.2019 16 50 59406")).toDF("input_timestamp")
  dfDate.withColumn ("datetype_timestamp",
          to_timestamp(col("input_timestamp"),"MM-dd-yyyy HH mm ss SSS"))
    . show(ложь)
 

Урожайность ниже выпуска

+--------------------------------------+-----+
|input_timestamp |datetype_timestamp |
+--------------------------------------+-----+
|01.07.2019 12 01 19 406|2019-07-01 12:01:19|
|24-06-2019 12 01 19 406|2019-06-24 12:01:19|
|16-11-2019 16 44 55 406|2019-11-16 16:44:55|
|16.11.2019 16 50 59406|2019-11-16 16:50:59|
+--------------------------------------+-----+
 

час(), минута() и секунда()

импортировать org.apache.spark.sql.functions._
  val df = Seq(("2019-07-01 12:01:19.000"),
    ("2019-06-24 12:01:19.000"),
    ("2019-11-16 16:44:55.406"),
    ("2019-11-16 16:50:59.406")).toDF("input_timestamp")
  df.withColumn ("час", час (столбец ("input_timestamp")))
    .withColumn ("минута", минута (столбец ("input_timestamp")))
    .withColumn ("секунда", секунда (столбец ("input_timestamp")))
    .show(ложь)
 

Выход ниже выхода

+-----------------------+----+------+------+
|input_timestamp |час|минута|секунда|
+-----------------------+----+------+------+
|2019-07-01 12:01:19. 000|12 |1 |19 |
|2019-06-24 12:01:19.000|12 |1 |19 |
|2019-11-16 16:44:55.406|16 |44 |55 |
|2019-11-16 16:50:59.406|16 |50 |59 |
+-----------------------+----+------+------+
 

Заключение:

В этом посте я объединил полный список функций Spark Date и Timestamp с описанием и примерами некоторых часто используемых. Вы можете найти больше информации об этом в следующем блоге

Счастливого обучения!!

Функции ДАТА/ВРЕМЯ в SQL. Учебное пособие по использованию CAST, EXTRACT… | Джейсон Ли

Учебник по использованию CAST, EXTRACT и DATE_TRUNC

Фото Лукаса Блазека на Unsplash

Работа с датами и временем является обычной практикой при работе с SQL. Используя даты, мы можем рассчитать изменения во времени, тенденции в данных, выполнить интервальную арифметику. Чтобы лучше понять последствия основной бизнес-проблемы.

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

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

  1. ЛИТОЕ
  2. EXTRACT
  3. DATE_TRUNC

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

Функция CAST преобразует выбранный тип данных в другой. Довольно прямолинейно. Он изменяет один тип на ваш предпочтительный тип. Синтаксис ниже.

 CAST(выражение AS  тип данных  ) 

Ниже приведен пример того, как его можно применить к дате и времени.

 SELECT 
NOW(),
CAST(NOW() AS TIMESTAMP),
CAST(NOW() AS DATE),
CAST(NOW() AS TIME),
CURRENT_DATE,
CURRENT_TIME

В этом запросе мы ожидаем иметь 6 выходов. Если вы не знакомы с NOW() , CURRENT_DATE , CURRENT_TIME , это функции SQL, которые извлекают текущее время или дату. Ниже приведены все результаты запроса по порядку. (обратите внимание — вы получите разные числа, так как функции вызывают точное время или дату)

  • 2020–03–28 23:18:20.261879+00:00
  • 2020–03–28 23:18:20.261879
  • 2020–03–28
  • 23:18:20.261879
  • 2020–03–28
  • 23:18:20.261879+00:00

Глядя на первый результат использования NOW() отдельно, мы получаем полное значение метки времени, включая часовой пояс. Теперь, когда мы переходим ко второму выводу, мы использовали CAST только для получения TIMESTAMP, который не включает часовой пояс из NOW() . Теперь мы можем увидеть, как работает приведение. Мы передаем значение, которое хотим преобразовать, а затем указываем нужный тип.

Затем мы используем CAST() на NOW() , но передаем DATE в качестве желаемого типа. Теперь мы получаем метку времени, разделенную только на формат год/месяц/день. Точно так же посмотрите на функцию CAST() с NOW() и только TIME , и мы получим только значение времени без даты.

Мы можем видеть, как CAST Функция работает со временем, и последние два вывода, использующие CURRENT_DATE и CURRENT_TIME , предназначены только для того, чтобы вы могли увидеть сравнение результатов.

Другие примеры — без временных меток

SQL также позволяет использовать функции CAST() с типами без временных меток.

 SELECT 
CAST(1.34 AS INT),
CAST(1 AS BOOLEAN),
CAST(2.65 AS DEC(3,0))

Результаты этого запроса:

  • 1 → Поскольку целое число может t есть десятичные числа, он будет округлен до ближайшего целого числа
  • истина → 1, так как логическое значение истинно, а 0 ложно
  • 3 → используя DEC() , мы также можем сделать обратное нашему первому целочисленному CAST.

Интервалы

В SQL вы также можете использовать ИНТЕРВАЛ , чтобы добавить больше времени к любой имеющейся у вас метке времени. Для приведенных ниже примеров вам не нужно использовать функцию CAST() , но я решил сделать это только для получения даты.

 ВЫБЕРИТЕ 
ПЕРЕДАЧА (СЕЙЧАС () КАК ДАТА) КАК СЕГОДНЯ_ДАТА,
ПЕРЕДАЧА (( ИНТЕРВАЛ '3 ДНЯ' + СЕЙЧАС()) КАК ДАТА) КАК три_дня,
CAST(( ИНТЕРВАЛ '3 НЕДЕЛИ' + СЕЙЧАС()) КАК ДАТА) КАК three_weeks,
CAST(( ИНТЕРВАЛ '3 МЕСЯЦА' + NOW()) AS DATE) AS three_months,
CAST(( INTERVAL '3 YEARS' + NOW()) AS DATE) AS three_years
Output

Мы видим, что используя INTERVAL в дополнение к длине интервала в днях, неделях, месяцах или годах добавляет больше времени к любой имеющейся у вас дате — в этом примере текущая дата получается из СЕЙЧАС() .

Далее мы можем посмотреть на извлечение определенного формата из метки времени. Цель состоит в том, чтобы извлечь часть из метки времени. Например, если нам нужен только месяц с даты 10. 12.2018, мы получим декабрь (12).

Давайте посмотрим на EXTRACT синтаксис

 EXTRACT(part FROM date) 

Мы указываем тип извлечения, который нам нужен как часть , а затем источник, который нужно извлечь date . EXTRACT — это инструмент импорта для анализа данных временных рядов. Это помогает вам изолировать группы в ваших временных метках для агрегирования данных на основе точного времени. Например, если магазин по аренде автомобилей хочет найти самый загруженный пункт проката ЧАС по ПОНЕДЕЛЬНИКАМ каждые МАЯ , вы можете сделать это с помощью EXTRACT . Вы можете детализировать детали и увидеть более ценную информацию.

Предположим, мы запускаем NOW() и наша отметка времени 2020–03–29 00:27:51.677318+00:00 , мы можем использовать EXTRACT , чтобы получить следующее.

 ВЫБЕРИТЕ 
ИЗВЛЕЧЬ(МИНУТА ОТ СЕЙЧАС()) КАК МИНУТА,
ИЗВЛЕЧЬ(ЧАС ОТ СЕЙЧАС()) КАК ЧАС,
ИЗВЛЕЧЬ(ДЕНЬ ОТ СЕЙЧАС()) КАК ДЕНЬ,
ВЫЧИСЛЕНИЕ(НЕДЕЛЯ С СЕГОДНЯ()) КАК НЕДЕЛЯ,
ВЫЧИСЛЕНИЕ(МЕСЯЦ С СЕГОДНЯ()) КАК МЕСЯЦ,
ВЫЧИСЛЕНИЕ(ГОД С СЕГОДНЯ()) КАК ГОД,
ВЫЧИСЛЕНИЕ(ДАУ ОТ СЕГОДНЯ()) КАК ДЕНЬ_НЕДЕЛИ,
ВЫЧИСЛЕНИЕ (DOY FROM NOW()) AS DAY_OF_YEAR,
EXTRACT(QUARTER FROM NOW()) AS QQUARTER,
EXTRACT(TIMEZONE FROM NOW()) AS TIMEZONE
Output

Мы видим, что можем вдаваться в мельчайшие детали того, как мы хотите извлечь информацию из наших временных меток. Примечание — DOW — день недели с воскресенья (0) по субботу (6).

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

 ВЫБЕРИТЕ 
ВЫДЕРЖКА(ЧАС ОТ RENTAL_DATE) AS HOUR,
COUNT(*) as RENTALS
FROM RENTAL_DATE
ГДЕ
EXTRACT(DOW FROM RENTAL_DATE) = 1 AND
EXTRACT(MONTH FROM RENTAL_DATE) 4 9 BY 90UPATE = 3RO 9 90UPATE) 4 DER 9 5 GRENTAL_DATE BY RENTALS DESC

Помните, что нам нужна самая загруженная аренда ЧАСОВ по ПОНЕДЕЛЬНИКАМ каждые МАЯ . Во-первых, мы используем EXTRCT в SELECT чтобы указать, нам нужны только HOUR и всего COUNT . Затем мы передаем две функции EXTRACT для предложения WHERE для фильтрации только MONDAYS и MAY . Глядя на таблицу ниже, 11:00 — самое популярное время аренды каждый понедельник в мае, всего 11 аренд.

Выходные данные

Усечение — сокращение или как бы отсечение

Целью усечения даты в SQL является получение интервала с абсолютной точностью. Значения точности — это подмножество идентификаторов полей, которые можно использовать с ВЫДЕРЖКА . DATE_TRUNC вернет интервал или метку времени, а не число.

Синтаксис для DATE_TRUNC , time_column — это столбец базы данных, который содержит метку времени, которую вы хотите округлить, а ‘[интервал]’ определяет желаемый уровень точности.

 DATE_TRUNC(‘[interval]’, time_column) 

Предположим, что наш NOW() возвращает то же самое 2020–03–29 00:27:51.677318+00:00 , мы можем использовать date_part , чтобы получить следующее.

 ВЫБРАТЬ 
CAST(DATE_TRUNC('DAY', NOW()) AS DATE) AS DAY,
CAST(DATE_TRUNC('WEEK', NOW()) AS DATE) AS WEEK,
CAST(DATE_TRUNC('MONTH', NOW()) AS DATE) AS MONTH,
CAST(DATE_TRUNC('YEAR', NOW()) AS DATE) AS YEAR
Output

Думайте об использовании DATE_TRUNC как о получении интервала текущего положения, и каждый уровень интервала - это то, как обрезается дата. Примечание — нам не нужно было использовать CAST в этом примере. Я использовал его, чтобы убедиться, что формат чист для анализа.

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

 SELECT 
CAST (DATE_TRUNC ('Day', Rental_Date) как дата) как rental_day,
COUNT (*) в качестве аренды
из аренды
Группа по
Rental_day
Порядок. как использовать CAST , EXTRACT и DATE_TRUNC мы можем объединить некоторые из изученных нами методов в один практический пример.

В этом примере мы добавим новую функцию времени с именем ВОЗРАСТ , которая принимает 2 даты в качестве аргумента и выводит «ВОЗРАСТ» или время в годах и месяцах между датами.

Давайте завершим этот урок, извлекая список клиентов, у которых была самая большая продолжительность аренды ( AGE ) из 2019 года. –05–01 + 30 дней .

 SELECT 
CUSTING_ID,
EXTRACT (DOW FROM ARTENT_DATE) как Day_OF_WEEK,
Возраст (return_date, Rental_Date) AS ARTAL_DAY
от
Rental
, где
rental_days
от
rental
, где
rental_days
от
rental
, где
. AS TIMESTAMP) И
CAST ('2019-05-01' AS TIMESTAMP) + INTERVAL '30 DAY'
ORDER BY 3 DESC
Output

Надеюсь, вам удобно работать с временными метками в SQL. Вы научились использовать CAST , EXTRACT , INTERVAL , DATE_TRUNC и AGE . Вы должны быть хорошо подготовлены для анализа тенденций и глубже погрузиться в данные, чтобы найти информацию, которую вы, возможно, не могли найти раньше!

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