crear un conjunto de resultados de fechas del calendario

¡Debería usar un procedimiento almacenado para llenar un calendario durante 10 años en una base de datos SQL!

Tres columnas debo completar con los registros: fecha, día de la semana o fin de semana, nombre del día (lunes, ...).

Alguien me puede ayudar?

preguntado el 16 de mayo de 11 a las 18:05

¿Seguro que necesitas los registros? Tal vez una sp con ..no existe .. le dé el resultado que está buscando. -

4 Respuestas

Puedes hacerlo dinámicamente así:

WITH Dates AS (
        SELECT CONVERT(DATE, getdate()) as [Date]
        UNION ALL 
        SELECT DATEADD(DAY, 1, [Date])
        FROM Dates
        where Date < dateadd(yy, 10, getdate())

) 
SELECT [Date]
FROM Dates
OPTION (MAXRECURSION 4000)

contestado el 17 de mayo de 11 a las 19:05

Estoy casi seguro de que realmente quisiste decir CONVERT(DATE, getdate()). - Andriy M

@Andriy M sí, para SQL Server 2008 eso es mucho mejor: D'Arcy Rittich

pruebe esta versión (establece la fecha y hora y agrega todas las columnas solicitadas):

;WITH Dates AS (
        SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()),0) as DateOf,
            CASE WHEN datename(weekday,getdate()) IN ('Saturday','Sunday') THEN 'Weekend'
                 ELSE 'WeekDay' 
            END DayType,
            datename(weekday,getdate()) DayOfWeekName
        UNION ALL 
        SELECT DateOf+1,
            CASE WHEN datename(weekday,DateOf+1) IN ('Saturday','Sunday') THEN 'Weekend'
                 ELSE 'WeekDay' 
            END DayType,
            datename(weekday,DateOf+1) DayOfWeekName
        FROM Dates
        where DateOf < dateadd(yy, 10, getdate())

) 
SELECT DateOf,DayType,DayOfWeekName
FROM Dates
OPTION (MAXRECURSION 4000)

para insertar en una tabla intente esto:

DECLARE @DateTable table (DateOf datetime, DayType char(7), DayOfWeekName varchar(10))

;WITH Dates AS (
        SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()),0) as DateOf,
            CASE WHEN datename(weekday,getdate()) IN ('Saturday','Sunday') THEN 'Weekend'
                 ELSE 'WeekDay' 
            END DayType,
            datename(weekday,getdate()) DayOfWeekName
        UNION ALL 
        SELECT DateOf+1,
            CASE WHEN datename(weekday,DateOf+1) IN ('Saturday','Sunday') THEN 'Weekend'
                 ELSE 'WeekDay' 
            END DayType,
            datename(weekday,DateOf+1) DayOfWeekName
        FROM Dates
        where DateOf < dateadd(yy, 10, getdate())

)
INSERT INTO  @DateTable (DateOf,DayType,DayOfWeekName)
    SELECT DateOf,DayType,DayOfWeekName
    FROM Dates
    OPTION (MAXRECURSION 4000)

seleccione los 10 mejores * de @DateTable

OTUPUT:

DateOf                  DayType DayOfWeekName
----------------------- ------- -------------
2011-05-16 00:00:00.000 WeekDay Monday
2011-05-17 00:00:00.000 WeekDay Tuesday
2011-05-18 00:00:00.000 WeekDay Wednesday
2011-05-19 00:00:00.000 WeekDay Thursday
2011-05-20 00:00:00.000 WeekDay Friday
2011-05-21 00:00:00.000 Weekend Saturday
2011-05-22 00:00:00.000 Weekend Sunday
2011-05-23 00:00:00.000 WeekDay Monday
2011-05-24 00:00:00.000 WeekDay Tuesday
2011-05-25 00:00:00.000 WeekDay Wednesday

(10 row(s) affected)

contestado el 16 de mayo de 11 a las 22:05

Me gusta esta solución, ¡pero necesitaría usar la fecha de inicio como parámetro! - Rachid

@Rachid, eso es fácil, solo reemplace todos los GETDATE() con su parámetro: @StartDate datetime - RacerX

¿Cómo debo ejecutar estos procedimientos almacenados haciendo clic en un botón en un formulario de Windows en VB.NET (cuando elegí una fecha de inicio de un selector de fecha y hora)? - Rachid

@Rachid, no uso VB.NET, así que tendrás que hacer una nueva pregunta al respecto. - RacerX

Lo planteé como un problema de tabla de conteo. Estoy usando spt_values ​​de Master como mi tabla de conteo. Solo llega hasta 2048, que son datos suficientes para 5.5 años. Puede crear su propia tabla de conteo con tantos números como necesite.

Declare @startDate Date = '1/1/2011'; 

SELECT DateAdd(d, number, @startDate) [Date], 
       CASE WHEN DATEPART(dw, DateAdd(d, number, @startDate)) IN (1,7) THEN 'Weekend' ELSE 'Weekday' END [WeekDayEnd], 
       DateName(weekday, DateAdd(d, number, @startDate)) DayOfWeek
FROM spt_values 
WHERE type = 'P';

Esto obtiene los siguientes resultados:

Date        WeekDayEnd  DayOfWeek
2011-01-01  Weekend     Saturday
2011-01-02  Weekend     Sunday
2011-01-03  Weekday     Monday
2011-01-04  Weekday     Tuesday
2011-01-05  Weekday     Wednesday
2011-01-06  Weekday     Thursday
2011-01-07  Weekday     Friday
2011-01-08  Weekend     Saturday
2011-01-09  Weekend     Sunday
2011-01-10  Weekday     Monday

contestado el 16 de mayo de 11 a las 23:05

UTILIZAR ESTE

set nocount on

SET DATEFIRST 7;

go
select date,
datename(dw,datepart(dw,date)) Day,
datepart(dw,date) Day,
'Segment' = case  
when datepart(dw,date)in (5,6) then 'WEEK_END' else 'Week_day' end
from calenderdate

set nocount off
> set nocount on
> 
> select  date,
> substring(cast(datename(dw,datepart(dw,date))as
> varchar(10)),1,3) Day, 'Segment' =
> case   when datepart(dw,date)in (5,6)
> then 'WEEK_END' else 'Week_day' end
> from calenderdate
> 
> set nocount off

salida

1/1/2011 Lunes 7 Día de la semana 1/2/2011 Martes 1 Día de la semana

contestado el 17 de mayo de 11 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.