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:
- Generar un conjunto o secuencia sin bucles - parte 1
- Generar un conjunto o secuencia sin bucles - parte 2
- Generar un conjunto o secuencia sin bucles - parte 3
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