Se eu tenho uma data 01/01/2009, quero descobrir que dia era, por exemplo, segunda, terça, etc ...
Existe uma função interna para isso no SQL Server 2005/2008? Ou preciso usar uma tabela auxiliar?
Se eu tenho uma data 01/01/2009, quero descobrir que dia era, por exemplo, segunda, terça, etc ...
Existe uma função interna para isso no SQL Server 2005/2008? Ou preciso usar uma tabela auxiliar?
Respostas:
Mesmo que a resposta do SQLMenace tenha sido aceita, há uma SET
opção importante que você deve conhecer
DATENAME retornará o nome correto da data, mas não o mesmo valor DATEPART, se o primeiro dia da semana tiver sido alterado, conforme ilustrado abaixo.
declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select [@DefaultDateFirst] = @DefaultDateFirst
set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7
--; Set the first day of week to * TUESDAY *
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
. Domingo será sempre zero.
DayOfWeek
enumeração tem DayOfWeek.Sunday
com um valor de ... 0
. Portanto, não importa o que DateFirst
estiver definido, um valor retornado por SQL não tratadoWEEKDAY
nunca será compatível com o equivalente do .NET. Sim, Microsoft.
SELECT CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END
select datename(dw,getdate())
Para obter um valor determinístico para o dia da semana em uma determinada data, você pode usar uma combinação de DATEPART () e @@ datefirst . Caso contrário, você depende das configurações do servidor.
Confira o site a seguir para uma solução melhor: MS SQL: dia da semana
O dia da semana estará no intervalo de 0 a 6, onde 0 é domingo, 1 é segunda-feira etc. Então você pode usar uma declaração de caso simples para retornar o nome correto do dia da semana.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Com o SQL Server 2012 em diante, você pode usar a FORMAT
função
SELECT FORMAT(GETDATE(), 'dddd')
esta é uma cópia de trabalho do meu código, verifique, como recuperar o nome do dia da data no sql
CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData]
@FromDate date,
@ToDate date
As
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from
ProjectTimeSheet pts
join Projects p on pts.ProjectID=p.ID
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END
Se você não quiser depender @@DATEFIRST
ou usar DATEPART(weekday, DateColumn)
, apenas calcule o dia da semana.
Nas semanas de segunda-feira (Europa), o mais simples é:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Para semanas baseadas no domingo (América), use:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Isso retorna o número do dia da semana (1 a 7) desde 1º de janeiro, respectivamente, 7 de janeiro de 1753.
Você pode usar, DATEPART(dw, GETDATE())
mas esteja ciente de que o resultado dependerá do @@DATEFIRST
valor de configuração do servidor SQL, que é o primeiro dia da semana (na Europa, o valor padrão 7 é domingo).
Se você deseja alterar o primeiro dia da semana para outro valor, pode usar, SET DATEFIRST
mas isso pode afetar todos os lugares da sua sessão de consulta que você não deseja.
Uma maneira alternativa é especificar explicitamente o valor do primeiro dia da semana como parâmetro e evitar dependendo da @@DATEFIRST
configuração. Você pode usar a seguinte fórmula para conseguir isso quando necessário:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
onde @WeekStartDay
é o primeiro dia da semana que você deseja para o seu sistema (de 1 a 7, o que significa de segunda a domingo).
Coloquei-o na função abaixo para que possamos reutilizá-lo facilmente:
CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
--Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
END
Exemplo de uso:
GetDayInWeek('2019-02-04 00:00:00', 1)
É equivalente ao seguinte (mas independente da configuração DATEFIRST do SQL Server):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Você pode encontrar esta versão útil.
-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA
select Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
(DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
from #test