una obtener mes manejo insertar hora fechas fecha entre ejemplo diferencia año sql sql-server cursor

mes - obtener hora sql server



Obtenga todas las fechas entre dos fechas en SQL Server (8)

Cree fácilmente una función de valor de tabla que devolverá una tabla con todas las fechas. Ingreso de fechas como cadena Puede personalizar la fecha en el formato que desee ''01 / 01/2017 ''o ''01 -01-2017'' en formatos de cadena (103,126 ...)

Prueba esto

CREATE FUNCTION [dbo].[DateRange_To_Table] ( @minDate_Str NVARCHAR(30), @maxDate_Str NVARCHAR(30)) RETURNS @Result TABLE(DateString NVARCHAR(30) NOT NULL, DateNameString NVARCHAR(30) NOT NULL) AS begin DECLARE @minDate DATETIME, @maxDate DATETIME SET @minDate = CONVERT(Datetime, @minDate_Str,103) SET @maxDate = CONVERT(Datetime, @maxDate_Str,103) INSERT INTO @Result(DateString, DateNameString ) SELECT CONVERT(NVARCHAR(10),@minDate,103), CONVERT(NVARCHAR(30),DATENAME(dw,@minDate)) WHILE @maxDate > @minDate BEGIN SET @minDate = (SELECT DATEADD(dd,1,@minDate)) INSERT INTO @Result(DateString, DateNameString ) SELECT CONVERT(NVARCHAR(10),@minDate,103), CONVERT(NVARCHAR(30),DATENAME(dw,@minDate)) END return end

Para ejecutar la función haz esto:

SELECT * FROM dbo.DateRange_To_Table (''01/01/2017'',''31/01/2017'')

La salida será

01/01/2017 Sunday 02/01/2017 Monday 03/01/2017 Tuesday 04/01/2017 Wednesday 05/01/2017 Thursday 06/01/2017 Friday 07/01/2017 Saturday 08/01/2017 Sunday 09/01/2017 Monday 10/01/2017 Tuesday 11/01/2017 Wednesday 12/01/2017 Thursday 13/01/2017 Friday 14/01/2017 Saturday 15/01/2017 Sunday 16/01/2017 Monday 17/01/2017 Tuesday 18/01/2017 Wednesday 19/01/2017 Thursday 20/01/2017 Friday 21/01/2017 Saturday 22/01/2017 Sunday 23/01/2017 Monday 24/01/2017 Tuesday 25/01/2017 Wednesday 26/01/2017 Thursday 27/01/2017 Friday 28/01/2017 Saturday 29/01/2017 Sunday 30/01/2017 Monday 31/01/2017 Tuesday

¿Cómo obtener las fechas entre dos fechas?

Tengo una variable @MAXDATE que almacena la fecha máxima de la tabla. Ahora quiero obtener todas las fechas entre @Maxdate y GETDATE() y quiero almacenar estas fechas en un cursor.

Hasta ahora he hecho lo siguiente:

;with GetDates As ( select DATEADD(day,1,@maxDate) as TheDate UNION ALL select DATEADD(day,1, TheDate) from GetDates where TheDate < GETDATE() )

Esto funciona perfectamente pero cuando intento almacenar estos valores en un cursor

SET @DateCurSor=CURSOR FOR SELECT TheDate FROM GetDates

error de compilación

Sintaxis incorrecta cerca de la palabra clave ''SET''.

Cómo resolver esto.

Gracias por adelantado


Este es el método que yo usaría.

DECLARE @DateFrom DATETIME = GETDATE(), @DateTo DATETIME = DATEADD(HOUR, -1, GETDATE() + 2); -- Add 2 days and minus one hour -- Dates spaced a day apart WITH MyDates (MyDate) AS ( SELECT @DateFrom UNION ALL SELECT DATEADD(DAY, 1, MyDate) FROM MyDates WHERE MyDate < @DateTo ) SELECT MyDates.MyDate , CONVERT(DATE, MyDates.MyDate) AS [MyDate in DATE format] FROM MyDates;

Este es un ejemplo similar, pero esta vez las fechas están separadas por una hora para ayudar a comprender mejor cómo funciona la consulta:

-- Alternative example with dates spaced an hour apart WITH MyDates (MyDate) AS (SELECT @DateFrom UNION ALL SELECT DATEADD(HOUR, 1, MyDate) FROM MyDates WHERE MyDate < @DateTo ) SELECT MyDates.MyDate FROM MyDates;

Como puede ver, la consulta es rápida, precisa y versátil.


Esto se puede considerar como una manera un tanto complicada, ya que en mi situación, no puedo usar una tabla CTE, por lo que decidí unirme con "sys.all_objects" y luego creé los números de fila y los agregué para comenzar la fecha hasta que llegara a la fecha final.

Vea el código a continuación donde generé todas las fechas en julio de 2018. Reemplace las fechas codificadas con sus propias variables (probadas en SQL Server 2016):

select top (datediff(dd, ''2018-06-30'', ''2018-07-31'')) ROW_NUMBER() over(order by a.name) as SiNo, Dateadd(dd, ROW_NUMBER() over(order by a.name) , ''2018-06-30'') as Dt from sys.all_objects a


He enumerado las fechas de 2 semanas más tarde. Puede utilizar la variable @period OR function dateiff (dd, @date_start, @date_end)

declare @period INT, @date_start datetime, @date_end datetime, @i int; set @period = 14 set @date_start = convert(date,DATEADD(D, -@period, curent_timestamp)) set @date_end = convert(date,current_timestamp) set @i = 1 create table #datesList(dts datetime) insert into #datesList values (@date_start) while @i <= @period Begin insert into #datesList values (dateadd(d,@i,@date_start)) set @i = @i + 1 end select cast(dts as DATE) from #datesList Drop Table #datesList


Mi primera sugerencia sería utilizar su tabla de calendario , si no tiene una, cree una. Son muy útiles. Su consulta es entonces tan simple como:

DECLARE @MinDate DATE = ''20140101'', @MaxDate DATE = ''20140106''; SELECT Date FROM dbo.Calendar WHERE Date >= @MinDate AND Date < @MaxDate;

Si no quiere, o no puede crear una tabla de calendario, aún puede hacer esto sobre la marcha sin un CTE recursivo:

DECLARE @MinDate DATE = ''20140101'', @MaxDate DATE = ''20140106''; SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) FROM sys.all_objects a CROSS JOIN sys.all_objects b;

Para leer más sobre esto ver:

Con respecto al uso de esta secuencia de fechas en un cursor, realmente recomendaría que encuentre otra forma. Por lo general, hay una alternativa basada en el conjunto que funcionará mucho mejor.

Así que con tus datos:

date | it_cd | qty 24-04-14 | i-1 | 10 26-04-14 | i-1 | 20

Para obtener la cantidad el 28-04-2014 (que reconozco que es su requisito), en realidad no necesita nada de lo anterior, simplemente puede usar:

SELECT TOP 1 date, it_cd, qty FROM T WHERE it_cd = ''i-1'' AND Date <= ''20140428'' ORDER BY Date DESC;

Si no lo quieres para un artículo en particular:

SELECT date, it_cd, qty FROM ( SELECT date, it_cd, qty, RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id ORDER BY date DESC) FROM T WHERE Date <= ''20140428'' ) T WHERE RowNumber = 1;


Puede usar este script para encontrar fechas entre dos fechas. Referencia tomada de este artículo:

DECLARE @StartDateTime DATETIME DECLARE @EndDateTime DATETIME SET @StartDateTime = ''2015-01-01'' SET @EndDateTime = ''2015-01-12''; WITH DateRange(DateData) AS ( SELECT @StartDateTime as Date UNION ALL SELECT DATEADD(d,1,DateData) FROM DateRange WHERE DateData < @EndDateTime ) SELECT DateData FROM DateRange OPTION (MAXRECURSION 0) GO


Solo diciendo ... aquí hay un enfoque más simple para esto:

declare @sdate date = ''2017-06-25'' , @edate date = ''2017-07-24'' ; with dates_CTE (date) as ( select @sdate Union ALL select DATEADD(day, 1, date) from dates_CTE where date < @edate ) select * from dates_CTE


create procedure [dbo].[p_display_dates](@startdate datetime,@enddate datetime) as begin declare @mxdate datetime declare @indate datetime create table #daterange (dater datetime) insert into #daterange values (@startdate) set @mxdate = (select MAX(dater) from #daterange) while @mxdate < @enddate begin set @indate = dateadd(day,1,@mxdate) insert into #daterange values (@indate) set @mxdate = (select MAX(dater) from #daterange) end select * from #daterange end