Problema:
Como na maioria das aplicações e bancos de dados, nossa aplicação recupera dados que possuem pelo menos uma data no registro. Existem momentos em que precisamos retornar o nome do dia ou recuperar o mês ou dia dos dados. Quais funções o SQL Server oferece para ajudar nessa área?
Solução:
O SQL Server oferece duas funções que ajudam a recuperar partes de uma data: DATEPART e DATENAME. Ambas as funções requerem dois parâmetros: a unidade de tempo e a data a ser consultada. A função DATEPART retorna um valor inteiro, enquanto a função DATENAME retorna um valor de string. As únicas unidades de tempo que retornam valores diferentes da função DATEPART são WEEKDAY e MONTH. Além disso, a diferenciação entre maiúsculas e minúsculas nos argumentos DatePart e DateName não é sensível, portanto, você pode usar letras maiúsculas ou minúsculas.
Exemplos de DatePart e DateName do SQL Server:
Abaixo estão alguns exemplos usando essas funções que podem ser usadas nas cláusulas WHERE, HAVING, GROUP BY e ORDER BY. Os exemplos usam o tipo de dados datetime2, mas você também pode usar o tipo de dados datetime, embora possa não obter tanta precisão para algumas partes da data. Além disso, outros tipos de dados de data funcionarão, mas algumas opções de datepart não funcionarão com base no formato da data.
SET NOCOUNT ON
DECLARE @Date datetime2
SET @Date = '2019-09-25 19:47:00.8631597'
SELECT DATEPART(ISO_WEEK,@Date)
SELECT DATEPART(TZoffset,@Date) -- não suportado pelo tipo de dados datetime
SELECT DATEPART(NANOSECOND,@Date)
SELECT DATEPART(MICROSECOND,@Date)
SELECT DATEPART(MS,@Date)
SELECT DATEPART(SS,@Date)
SELECT DATEPART(MINUTE,@Date)
SELECT DATEPART(HH,@Date)
SELECT DATEPART(DW,@Date)
SELECT DATEPART(WEEK,@Date)
SELECT DATEPART(DAY,@Date)
SELECT DATEPART(DAYOFYEAR,@Date)
SELECT DATEPART(MM,@Date)
SELECT DATEPART(QUARTER,@Date)
SELECT DATEPART(YYYY,@Date)
SELECT DATENAME(ISO_WEEK,@Date)
SELECT DATENAME(TZoffset,@Date)
SELECT DATENAME(nanosecond,@Date)
SELECT DATENAME(microsecond,@Date)
SELECT DATENAME(millisecond,@Date)
SELECT DATENAME(ss,@Date)
SELECT DATENAME(minute,@Date)
SELECT DATENAME(HOUR,@Date)
SELECT DATENAME(weekday,@Date)
SELECT DATENAME(wk,@Date)
SELECT DATENAME(d,@Date)
SELECT DATENAME(dayofyear,@Date)
SELECT DATENAME(m,@Date)
SELECT DATENAME(quarter,@Date)
SELECT DATENAME(YYYY,@Date)
SET NOCOUNT OFF
Criar uma tabela de partes de data do calendário:
Uma utilização da função DATEPART é se você precisar “perfilhar” um ano calendário nas várias partes e nomes da data. O script abaixo cria uma variável de tabela e insere as várias partes da data na variável de tabela:
SET NOCOUNT ON
DECLARE @StartDate DATE = '01/01/2011', @EndDate DATE = '12/31/2011'
DECLARE @Dates TABLE (
CalendarDate DATE PRIMARY KEY,
MonthNumber TINYINT,
DateNumber TINYINT,
DateOfYear SMALLINT,
WeekNumber TINYINT,
DayOfWeekNumber TINYINT,
NameOfMonth VARCHAR(15),
NameOfDay VARCHAR(15)
)
WHILE DATEDIFF(DAY,@StartDate,@EndDate) >= 0
BEGIN
INSERT INTO @Dates (CalendarDate, MonthNumber, DateNumber, DateOfYear, WeekNumber, DayOfWeekNumber , NameOfMonth, NameOfDay)
SELECT @StartDate,
DATEPART(MONTH,@StartDate),
DATEPART(DAY,@StartDate),
DATEPART(DAYOFYEAR,@StartDate),
DATEPART(WEEK,@StartDate),
DATEPART(DW,@StartDate),
DATENAME(MONTH,@StartDate),
DATENAME(DW,@StartDate)
SELECT @StartDate = DATEADD(DAY,1,@StartDate)
END
SELECT * FROM @Dates
SET NOCOUNT OFF
Conclusão:
As funções DatePart e DateName do SQL Server são úteis para recuperar partes específicas de uma data, como o mês, dia ou ano. Essas funções podem ser usadas em várias cláusulas e podem ajudar na criação de tabelas de partes de data do calendário. Compreender e utilizar essas funções pode aprimorar suas consultas do SQL Server e processos de recuperação de dados.