2009-07-10 26 views
288

Si tengo una fecha 01/01/2009, quiero saber qué día fue, p. Lunes, martes, etc. ...Obtener el día de la semana en SQL 2005/2008

¿Hay una función incorporada para esto en SQL 2005/2008? ¿O necesito usar una tabla auxiliar?

+1

Si tiene una tabla que contiene búsquedas de porciones de fecha, generalmente ha hecho algo mal.Las funciones de fecha de SQL Server son muchas y robustas por lo que cualquier dato que necesite extraer de una fecha se puede hacer fácilmente en una columna de fecha y hora. –

+4

tablas auxiliares son muy útiles para los cálculos de fecha, no es raro tener una tabla auxiliar de calendario ... –

+2

"Útil para los cálculos de fecha" es muy dudoso. La mayoría de los cálculos de fecha se pueden manejar sin ningún tipo de tabla auxiliar y tendrán un mejor rendimiento también. En algunos casos, una tabla simple de Números hará el trabajo, sin necesidad de una tabla con las fechas reales. La única razón por la que he visto que se necesita una tabla de calendario real es cuando las reglas para qué días son días de trabajo y qué días no son son muy complicadas. Lo que he visto con demasiada frecuencia es que las personas usan tablas de fechas porque no saben cómo hacerlo de otra manera. Luego tienen que completar la tabla de fechas de vez en cuando. Tonto. – ErikE

Respuesta

571

Uso DATENAME o DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday 
SELECT DATEPART(dw,GETDATE()) -- 6 
+0

thx, probé el nombre de la fecha pero usé d, me devolvió un número entero. dw funciona como se esperaba –

+25

Es por eso que prefiero usar select datename (weekday, weekday, getdate()). No tengo que recordar que dw vuelve el día de la semana ... cuando puedo usar "día de la semana" en su lugar. –

+9

Alguien echando un vistazo a esto - tenga en cuenta que el ** comienzo predeterminado de la semana es el domingo **. Mire la respuesta de @ Sung para saber cómo cambiarlo de manera segura –

83

A pesar de que la respuesta de SQLMenace ha sido aceptado, hay una opción importante SET usted debe ser consciente de

SET DATEFIRST

DATENAME se devolver la fecha correcta nombre pero no el mismo valor DATEPART si el primer día de la semana se ha modificado 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 
+27

Entonces, para obtener un valor constante de fecha y hora, debe '(@@ datefirst - 1 + datepart (día de la semana, date))% 7'. El domingo siempre será cero. –

+1

kindof horrible esto es estático así que tienes que seguir la consulta original, cambiar el valor, ejecutar la consulta, restablecer el patrón original –

+0

sí, eres hombre correcto, esta es una nota importante (Y) –

10

para obtener un valor determinístico para el día de la semana para una fecha determinada se puede usar una combinación de DATEPART() y @@datefirst. De lo contrario, dependerá de la configuración en el servidor.

Mira la siguiente sitio para una mejor solución: MS SQL: Day of Week

El día de la semana estará entonces en el rango de 0 a 6, donde 0 es domingo, 1 es el lunes, etc A continuación, se puede utilizar una declaración de caso simple para devolver el nombre de día de la semana correcto.

+3

Ponga la respuesta en la respuesta para que la gente no tenga que hacer clic en un enlace para acceder a ella. –

+0

Esto sería aceptado como la respuesta correcta. Gracias. – Juozas

20
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 
+22

Debe saber que hay una función incorporada para lograr lo mismo. 'seleccionar nombre de fecha (dw, getdate())' –

+1

Gracias, función incorporada puede reducir la línea de código – Sutirth

+5

@SohamDasgupta esta función incorporada no devuelve el mismo resultado para la versión no inglesa de MS SQL. –

3

Ésta es una copia de trabajo de mi código comprobarlo, cómo retrive nombre del día de 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 

feliz de codificación ....

+0

¿Qué tal un etiquetado feliz? ;) – tamasgal

+0

ja, ja, ja ... –

0

Usted puede encontrar esta versión muy ú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)[email protected]@datefirst-1)*4+1,3),Datum 
     from #test 
+1

Este es un código obtuso, y no da ninguna indicación de lo que está haciendo o tratando de lograr – brewmanz

8

EUROPA:

declare @d datetime; 
set @d=getdate(); 
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1); 
+2

Incluya la explicación de lo que hace su código y cómo responde la pregunta. Si obtiene un fragmento de código como respuesta, es posible que no sepa qué hacer con él. La respuesta debería dar al OP y a los futuros visitantes orientación sobre cómo depurar y solucionar su problema. Señalar, cuál es la idea detrás de su código, ayuda enormemente a comprender el problema y aplicar o modificar su solución. – Palec

5

Con SQL Server 2012 y en adelante se puede utilizar la función

SELECT FORMAT(GETDATE(), 'dddd') 
1

FORMAT Si no quiere depender de @@DATEFIRST o utilizar DATEPART(weekday, DateColumn), justo Calcule el día de la semana usted mismo.

Durante semanas los lunes base (Europa) más simple es:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay 

Durante semanas basados ​​Domingo (América) Uso:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay 

Esto devolverá el número de días de la semana (1 a 7) cada vez desde enero Primero, 7mo, 1753.

Cuestiones relacionadas