2011-02-26 138 views
193

Tengo un start_date y end_date. Quiero obtener la lista de fechas entre estas dos fechas. ¿Alguien puede ayudarme a señalar el error en mi consulta?Consulta SQL para seleccionar fechas entre dos fechas

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1 
    and Date between 2011/02/25 and 2011/02/27 

Aquí Date es una variable datetime.

Respuesta

328

se debería poner esas dos fechas entre comillas simples como ..

select Date, TotalAllowance from Calculation where EmployeeId = 1 
      and Date between '2011/02/25' and '2011/02/27' 

o puede utilizar

select Date, TotalAllowance from Calculation where EmployeeId = 1 
      and Date >= '2011/02/25' and Date <= '2011/02/27' 
+33

El Servidor SQL predetermina una fecha sin hora a 00:00:00. Entonces, ¿esta consulta no arrojará nada de 2011/02/25 y 2011/02/26 a la medianoche? – Matt

+5

@Deepak, su segundo bit debería decir> = y <= – IndoKnight

+2

Puede mencionar que el orden es importante en la función BETWEEN. Tiene que ir desde el más antiguo a la izquierda y más reciente a la derecha. Esto no es intuitivo ya que = es un operador comparativo en sql y funciona para "EmployeeId = 1" o "1 = EmployeeId" en la cláusula where. –

12

Prueba esto:

select Date,TotalAllowance from Calculation where EmployeeId=1 
      and [Date] between '2011/02/25' and '2011/02/27' 

La fecha valores tienen que ser escrito como cadenas.

Para garantizar el futuro de su consulta para SQL Server 2008 y superior, debe escaparse Date porque es una palabra reservada en versiones posteriores.

Tenga en cuenta que las fechas sin horas toman la medianoche como valores predeterminados, por lo que es posible que no tenga el valor correcto allí.

+1

La fecha no es una palabra clave y no necesita ser escapada. El resaltado de sintaxis es solo resaltado de sintaxis, las palabras clave solo necesitan ser escapadas si causan un error de sintaxis. También es una buena práctica usar la conversión explícita en lugar de la conversión implícita de las constantes de las fechas. - y Fecha entre CAST ('2011/02/25'AS DATETIME) y CAST (' 2011/02/27'AS DATETIME) – tponthieux

+4

Naturalmente, tiene razón si se trata de SQL Server 2005, que el OP etiquetó. Sin embargo, la fecha se reserva en 2008 y en adelante, por lo que para futuras pruebas, no hay daño al escapar. He editado mi respuesta. –

+1

Si especificara la fecha única para ambos, devolvería cero filas, pero supongo que no es un requisito de la operación –

6

Esta consulta está bueno para ir a buscar los valores entre la fecha actual y sus próximos 3 fechas

SELECT * FROM tableName WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 

Esto eventualmente agregará 3 días adicionales de memoria intermedia a la fecha actual.

+0

Esta no es la sintaxis correcta para MS SQL. ( – Vadzim

5
select * from test 
    where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4' 

- si el tipo de datos es diferente

7
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27')) 

Aquí, primero agregar un día a la endDate actual, será 2011-02-28 00:00:00, entonces restar un segundo para hacer que la fecha de finalización 2011-02-27 23:59:59. Al hacer esto, puede obtener todas las fechas entre los intervalos dados.

output: 
2011/02/25 
2011/02/26 
2011/02/27 
-7
SELECT Date, TotalAllowance 
FROM Calculation 
WHERE EmployeeId = 1 
    AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
       AND to_date ('2011/02/27','yyyy-mm-dd'); 
+1

Probablemente estaba pensando en Oracle SQL cuando escribió esta respuesta. Esto es válido en Oracle. No tanto en SQL Server (por lo que puedo ver). –

3

trate de poner las fechas entre el # # por ejemplo:

#2013/4/4# and #2013/4/20# 

que trabajó para mí.

--- EDIT --- Recibí una notificación de que perdí dos puntos de reputación porque alguien votó negativamente esta respuesta. Por favor, no solo vote abajo si la respuesta no le funciona. Solicite más información/ayuda en los comentarios, o consulte otras soluciones.

No me preocupan los puntos de reputación, solo digo que los votos negativos no están hechos para eso.

+0

¿Qué hace # en este contexto? –

+0

@BK es un delimitador, como comillas para cadenas "Al suministrar valores a una instrucción SQL, por ejemplo como criterios de consulta, su tipo de datos debe estar correctamente definido por un" calificador ".Esto se hace al incluir el valor entre un par de caracteres apropiados. "Reference -> [link] (http://www.fontstuff.com/access/acctut15pfv.htm) – Casper

+1

@BK Si es una sintaxis TSql, usted necesitará utilizar comillas simples (** '**) para obtener lo que necesita. referencias * [conceptos básicos de sql-fontstuff.com] (http://www.fontstuff.com/access/acctut15pfv. htm) * [SQL inicial: Paul Wilton, John Colby] (http://books.google.rs/books?id=9eqbXSnji84C&printsec=frontcover#v=onepage&q&f=false) – Casper

1
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#; 
90

Desde una fecha y hora sin un segmento de tiempo especificado tendrá un valor de date 00:00:00.000, si usted quiere asegurarse de que recibe todas las fechas de su rango, debe suministrar el tiempo para su fecha de finalización o aumentar su fecha de finalización y uso <.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999' 

O

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28' 

O

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999' 

NO utilice los siguientes, ya que podría volver algunos registros de 2011/02/28 si sus tiempos son 00: 00: 00.000 .

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28' 
+32

Las personas aún miran estas preguntas y respuestas, incluso si se plantearon originalmente hace algún tiempo. Vine en busca de una respuesta, y gran parte de lo que vi aquí fue incompleto o absolutamente incorrecto. Mi respuesta no ayudará al cartel original, pero podría ayudar a alguien, tal vez incluso a tres años de ahora. – WelshDragon

+3

Tu respuesta me ayudó muchísimo y, @WelshDragon: las otras respuestas omiten el hecho de que el formato de fecha debe ser "fecha simple" en el servidor para ignorar las horas. "<= END_DATE" asume las 12AM, que no sabía. Estaba realizando una consulta con "... <= 01/01/2014" y no pude entender por qué los pedidos en esa fecha no se mostraban para el 1er. Muchas gracias. – Keith

+0

@WelshDragon: su respuesta es un material muy bueno para usar las fechas como cláusula where. Gracias –

1

si su fecha en 24 horas y comenzará en la mañana y al final de la noche debe añadir algo como:

declare @Approval_date datetime 
set @Approval_date =getdate() 
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999' 
2

mejor consulta para la selección de fecha entre la fecha actual y tres días más:

select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN  
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE() 

mejor de consulta para la selección de fecha entre la fecha actual y próximos tres días:

select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN 
    CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 
+0

Esta no es la sintaxis correcta para MS SQL. – Vadzim

3
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1 
    and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27' 
0

me gusta usar la sintaxis '1 MonthName 2015' para fechas ejemplo:

WHERE aa.AuditDate>='1 September 2015' 
    AND aa.AuditDate<='30 September 2015' 

para fechas

1

marque a continuación ejemplos: Tanto trabajo y de no trabajo.

select * from tblUser Where  
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working** 

O

select * from tblUser Where 
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working** 

O

select * from tblUser Where 
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working** 

Y a continuación no está funcionando:

select * from tblUser Where 
Convert(Varchar(10),CreatedDate,111) >= Convert(Varchar(10),'01-01-2015',111) and Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working** 


select * from tblUser Where 
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working** 
0

Yo iría por

select Date,TotalAllowance from Calculation where EmployeeId=1 
      and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27') 

La lógica es que >= incluye toda la fecha de inicio y < excluye la fecha de finalización, por lo que agregamos una unidad a la fecha de finalización. Esto puede adaptarse durante meses, por ejemplo:

select Date, ... from ... 
      where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1) 
4

Esto es muy antiguo, pero teniendo en cuenta una gran cantidad de experiencias que he tenido con las fechas, puede que desee tener en cuenta lo siguiente: La gente usa diferentes configuraciones regionales, como tal, algunos las personas (y algunas bases de datos/computadoras, según la configuración regional) pueden leer esta fecha el 11/12/2016 como el 11 de diciembre de 2016 o el 12 de noviembre de 2016. Aún más, el 16/11/12 proporcionado a la base de datos MySQL se convertirá internamente a 12 Nov 2016, mientras que la base de datos Access que se ejecuta en una computadora de configuración regional del Reino Unido lo interpretará y almacenará como 16 de noviembre de 2012.

Por lo tanto, establecí mi política de ser explícito cada vez que voy a interactuar con fechas y bases de datos.Así que siempre suministrar mis consultas y códigos de programación de la siguiente manera:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016'; 

Tenga en cuenta también que Access aceptará el #, por lo tanto:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#; 

pero el servidor MS SQL no, así que siempre utilice " ' "como arriba, que ambas bases de datos aceptan.

Y al conseguir que la fecha a partir de una variable en el código, siempre convertir el resultado en cadena de la siguiente manera:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy") 

Estoy escribiendo esto porque sé que a veces algunos programadores pueden no ser lo suficientemente agudo para detectar la conversión inherente No habrá ningún error para las fechas < 13, ¡solo diferentes resultados!

En cuanto a la pregunta hecha, añadir un día para la última fecha y hacer la comparación de la siguiente manera:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
-1

Es mejor escribir de esta manera:

CREATE PROCEDURE dbo.Get_Data_By_Dates 
(
    @EmployeeId INT = 1, 
    @Start_Date DATE, 
    @End_Date Date 
) 
AS 
Select * FROM Calculation 
    where [email protected] AND Test_Date BETWEEN @Start_Date AND @End_Date 
RETURN 
+0

El uso de un procedimiento almacenado en esta situación no tendrá ningún sentido, ya que reducirá terriblemente la flexibilidad de la consulta SQL, será muy específico. Si no desea utilizarlo en una situación realmente específica, no lo utilice. un procedimiento almacenado: también hay muchas mejoras disponibles para su procedimiento almacenado para que pueda encontrarlas en esta comunidad;). –

0

Ca que intenta este SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 
1

podemos utilizarlo para mostrar dos fechas de datos pero esto buscará los datos completos y los comparará e nuestro proceso lento de datos de gran tamaño, por lo que sugiero que todos puedan usar datediff:

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 " 

aquí calandra es la tabla, dt como la variable de fecha de inicio y DT2 es la variable de fecha de llegada.