Si tengo una fecha 01/01/2009, quiero saber qué día fue, por ejemplo, lunes, martes, etc.
¿Existe una función integrada para esto en SQL Server 2005/2008? ¿O necesito usar una mesa auxiliar?
Si tengo una fecha 01/01/2009, quiero saber qué día fue, por ejemplo, lunes, martes, etc.
¿Existe una función integrada para esto en SQL Server 2005/2008? ¿O necesito usar una mesa auxiliar?
Respuestas:
Aunque la respuesta de SQLMenace ha sido aceptada, hay una SET
opción importante que debe tener en cuenta
DATENAME devolverá el nombre correcto de la fecha pero no el mismo valor DATEPART si el primer día de la semana se ha cambiado como se ilustra a continuación.
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
. El domingo siempre será cero.
DayOfWeek
enumeración tiene DayOfWeek.Sunday
un valor de ... 0
. Por lo tanto, no importa lo establecido DateFirst
, un valor devuelto por SQL no tratadoWEEKDAY
nunca será compatible con la contraparte .NET. Yay, 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 obtener un valor determinista para el día de la semana para una fecha determinada, puede usar una combinación de DATEPART () y @@ datefirst . De lo contrario, dependerá de la configuración del servidor.
Consulte el siguiente sitio para obtener una mejor solución: MS SQL: Día de la semana
El día de la semana estará entonces en el rango de 0 a 6, donde 0 es domingo, 1 es lunes, etc. Luego puede usar una declaración de caso simple para devolver el nombre correcto del día de la semana.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Con SQL Server 2012 y versiones posteriores, puede usar la FORMAT
función
SELECT FORMAT(GETDATE(), 'dddd')
esta es una copia de trabajo de mi código, verifíquelo, cómo recuperar el nombre del día desde la fecha en 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
Si no quiere depender @@DATEFIRST
o usar DATEPART(weekday, DateColumn)
, calcule el día de la semana usted mismo.
Para las semanas basadas en lunes (Europa) lo más simple es:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Para las semanas de domingo (América) use:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Esto devuelve el número del día de la semana (1 a 7) desde el 1 de enero, respectivamente, el 7 de 1753.
Puede usar, DATEPART(dw, GETDATE())
pero tenga en cuenta que el resultado dependerá del @@DATEFIRST
valor de configuración del servidor SQL, que es la configuración del primer día de la semana (en Europa, el valor predeterminado 7 es el domingo).
Si desea cambiar el primer día de la semana a otro valor, puede usarlo, SET DATEFIRST
pero esto puede afectar a todas las partes de su sesión de consulta que no desee.
Una forma alternativa es especificar explícitamente el valor del primer día de la semana como parámetro y evitar depender de la @@DATEFIRST
configuración. Puede usar la siguiente fórmula para lograrlo cuando lo necesite:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
donde @WeekStartDay
es el primer día de la semana que desea para su sistema (del 1 al 7, lo que significa de lunes a domingo).
Lo he incluido en la siguiente función para que podamos reutilizarlo fácilmente:
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
Ejemplo de uso:
GetDayInWeek('2019-02-04 00:00:00', 1)
Es equivalente a lo siguiente (pero independiente de la configuración DATEFIRST del servidor SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Puede encontrar esta versión ú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