Seleccionar datos del rango de fechas entre dos fechas

100

Tengo una tabla nombrada Product_Salesy contiene datos como este

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
3          | 12      | 7   | 2013-01-05 | 2013-01-07
6          | 22      | 14  | 2013-01-06 | 2013-01-10
8          | 11      | 9   | 2013-02-05 | 2013-02-11

Ahora bien, ¿cuál es la consulta si quiero seleccionar datos de ventas entre dos fechas de un rango de fechas?

Por ejemplo, quiero seleccionar datos de ventas desde 2013-01-03hasta 2013-01-09.

Ronjon
fuente
To_date> 2013-01-03 Y From_date <2013-01-09. ?
jpulikkottil

Respuestas:

144

descripción de la intersección del intervalo

Como puede ver, hay dos formas de hacer las cosas:

  • alista todas las opciones aceptables
  • excluir todas las opciones incorrectas

Evidentemente, la segunda vía es mucho más sencilla (solo dos casos contra cuatro).

Su SQL se verá así:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)
Dmitry Lukichev
fuente
13
Solo quiero decir que me encanta que dibujara esto en una pizarra para explicar la respuesta. Tienes mi respeto y mi admiración.
Ben Bynum
3
Sé que este problema es bastante antiguo, pero si no desea o no puede usar esta WHERE NOTcondición, cambiar a los operadores y agregar un igual también está haciendo el trabajo: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück
84
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

Tienes que cubrir todas las posibilidades. From_Date o To_Date podría estar entre su rango de fechas o las fechas de registro podrían cubrir todo el rango.

Si una de From_dateo To_dateestá entre las fechas, o From_datees menor que la fecha de inicio y To_datees mayor que la fecha de finalización; entonces esta fila debería devolverse.

Ángel caido
fuente
Respuesta de la página (Y)
GreenROBO
¿Cómo devolver todos los datos si ambas fechas de entrada son nulas o están vacías? y también, si una de las fechas es nula o vacía, debería obtener un resultado basado en ese criterio
Mundo de codificación
40

Pruebe la siguiente consulta para obtener fechas entre el rango:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'
jkmurphy1
fuente
8
¡Esto no cubre todas las posibilidades!
FallenAngel
@FallenAngel, ¿podría explicarme cuáles no están cubiertos?
Babblo
4
Verifique mi respuesta , por favor, no cubrió las ventas que comenzaron antes start_datepero terminaron entre start_datey end_date. Por otro lado, la pregunta no es lo suficientemente clara, supongo, no tenemos ni idea de si deberíamos tomar las ventas que son estrictamente entre fechas determinadas o fechas que incluyen parcialmente el rango de fechas, pero que pueden extenderse de un lado, del otro o de ambos. Entonces, el problema básico es que la pregunta no está clara, supongo.
FallenAngel
Sé que esta publicación es antigua, pero para aquellos que lean: esto no es entre fechas, pero incluye las fechas. Desde y hacia.
Ken
23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'
Berkay Turancı
fuente
Su selección será incorrecta para el ejemplo From_date: 2012-12-30 a To_Date: 2013-01-05. Estas fechas están dentro del rango deseado, pero en su SQL no se devolverán porque comienzan antes del rango, pero terminan dentro del rango.
NetVicious
5

Esto cubre todas las condiciones que está buscando.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')
Avinash
fuente
4
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)
Kiran K
fuente
1
Para la intersección inclusiva, querrá agregar una cláusula OR más para detectar cuando from_date es antes del inicio y to_date es posterior al final: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback
3

Por favor, inténtalo:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)
TechDo
fuente
3

Solo mis 2 centavos, encuentro que usar el formato "dd-MMM-aaaa" es más seguro, ya que el servidor de base de datos sabrá lo que quiere independientemente de la configuración regional del servidor. De lo contrario, podría tener problemas en un servidor que tenga su configuración regional de fecha como aaaa-dd-mm (por cualquier motivo)

Así:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

Siempre me ha funcionado bien ;-)

KDT
fuente
3

Esto funciona en SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'
I_Valchev
fuente
3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
Gestef
fuente
2

Esta consulta te ayudará a:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014
Ritesh Yadav
fuente
1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )
zafarsiddiqui
fuente
1

Verifique esta consulta, creé esta consulta para verificar si la fecha de registro coincide con las fechas de reserva

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

esto recuperará los detalles que se superponen, para obtener los detalles que no se superponen, luego eliminará el 'NO' de la consulta

anandd360
fuente
1

También puede intentar usar los siguientes fragmentos:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'
rashedcs
fuente
1

Esto es fácil, use esta consulta para buscar datos seleccionados del rango de fechas entre dos fechas

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')
F5 amigo
fuente
0

Debe comparar fechas en sql al igual que compara valores numéricos,

SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'
Adeel Ahmed
fuente
0

Aquí hay una consulta para encontrar todas las ventas de productos que se realizaron durante el mes de agosto.

  • Buscar Product_sales que estuvieron activas durante el mes de agosto
  • Incluya todo lo que comenzó antes de finales de agosto
  • Excluir todo lo que terminó antes del 1 de agosto

También agrega una declaración de caso para validar la consulta

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 
jspooner
fuente
0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))
JIYAUL MUSTAPHA
fuente
-1

esto es fácil, use esta consulta para encontrar lo que desea.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Abdirazack
fuente