2008-08-14 163 views
37

En SQL Server tengo una columna DATETIME que incluye un elemento de tiempo.¿Comparar una cadena de fecha a fecha y hora en SQL Server?

Ejemplo:

'14 AUG 2008 14:23:019' 

¿Cuál es el método mejor sólo para seleccionar los registros para un día en particular, haciendo caso omiso de la pieza del tiempo?

Ejemplo: (No es seguro, ya que no se corresponde con la parte de hora y vuelve ninguna fila)

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime = @p_date 

Nota: En vista de este sitio también se trata de tomar notas y técnicas de recoger y luego se olvida , Voy a publicar mi propia respuesta a esta pregunta ya que las cosas de DATETIME en MSSQL es probablemente el tema que busco más en SQLBOL.


actualización ejemplo clarificada para ser más específicos.


Editar Lo sentimos, pero he tenido respuestas incorrectas a abajo-mod (respuestas que devuelven resultados erróneos).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') volverá el 13 y el 14.

@wearejimbo: ¡Cierre, pero no cigarro! insignia otorgada a usted. Se ha perdido a cabo registros escritos en 14/08/2008 23: 59: 001 a 23: 59: (. Es decir, menos de 1 segundo antes de la medianoche) 999

Respuesta

35

Technique 1:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime >= @p_date 
AND  column_datetime < DATEADD(d, 1, @p_date) 

La ventaja de este es que usará cualquier índice en 'column_datetime' si existe.

+11

creo que CAST ('14-AGO-2008' como DateTime) es ligeramente mejor. Creo que es un poco más legible y creo que CAST es más portable que CONVERT() porque CAST() es compatible con ANSI SQL-92 y -99 –

+1

Puede usar la palabra clave BETWEEN como una forma abreviada de esta respuesta. –

+1

@BorhanMooz, en realidad, BETWEEN no captura la interrelación> =/ NargothBond

1
SELECT * 
FROM table1 
WHERE CONVERT(varchar(10),columnDatetime,121) = 
     CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121) 

Esto convertirá el datatime y la cadena en varchar del formato "YYYY-MM-DD".

Esto es muy feo, pero debería funcionar

4

Technique 2:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE DATEDIFF(d, column_datetime, @p_date) = 0 

Si el campo column_datetime no está indexado, y es poco probable que sea (o el índice es poco probable que se utiliza), entonces usar DATEDIFF() es más corto.

8

Simplemente compare los valores de año, mes y día.

Declare @DateToSearch DateTime 
Set @DateToSearch = '14 AUG 2008' 

SELECT * 
FROM table1 
WHERE Year(column_datetime) = Year(@DateToSearch) 
     AND Month(column_datetime) = Month(@DateToSearch) 
     AND Day(column_datetime) = Day(@DateToSearch) 
3

Esta función moldeada (Planta (Cast (GetDate() Como Float)) Como DateTime) devuelve un tipo de datos de fecha y hora con la porción de tiempo eliminado y podría ser utilizado como tal.

Select 
* 
Table1 
Where 
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008' 

o

DECLARE @p_date DATETIME 
SET  @p_date = Cast('14 AUG 2008' as DateTime) 

SELECT * 
FROM  table1 
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date 
+0

¿Las múltiples funciones aplicadas al campo (si están indexadas) no convertirán esto en una exploración de tabla completa? –

1

Sé que esto no es exactamente lo que quiere hacer esto, pero podría ser un comienzo:

SELECT * 
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
     DATEPART(mm, column_dateTime) as Month, 
     DATEPART(dd, column_dateTime) as Day 
     FROM table1) 
WHERE Year = '2008' 
AND Month = '8' 
AND Day = '14' 
4

Algo como esto?

SELECT * 
FROM table1 
WHERE convert(varchar, column_datetime, 111) = '2008/08/14' 
14

En SQL Server 2008, puede utilizar el nuevo tipo de datos FECHA

DECLARE @pDate DATE='2008-08-14' 

SELECT colA, colB 
FROM table1 
WHERE convert(date, colDateTime) = @pDate 

@Guy. Creo que encontrará que esta solución se escala bien. Eche un vistazo a query execution plan de su consulta original.

Y para mine:

3

¿Cómo conseguir la parte de fecha de un campo DATETIME en MS SQL Server:

Uno de los más rápidos y las formas más limpias de hacer esto es utilizando

DATEADD(dd, DATEDIFF(dd, 0, @DAY), 0) 

Evita que la CPU revienta "convertir la fecha en una cadena sin tiempo y luego volver a convertirla" en lógica.

Tampoco expone la implementación interna que la "porción de tiempo se expresa como una fracción" de la fecha.

Obtener la fecha del primer día del mes

DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0) 

Consigue el ROLMC fecha hace 1 año

DATEADD(m,-12,DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0)) 
0
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp 
1
DECLARE @Dat 

SELECT * 
FROM Jai 
WHERE                           
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                
      CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+    
        CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat 
4

buen punto sobre el índice en la respuesta que aceptaste

Sin embargo, si realmente buscar sólo en específico DATE o DATE rangesmenudo, entonces la mejor solución que encontré es añadir otra persistieron columna calculada a su mesa que sólo contendría la DATE, y añadir índice en esta columna:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED 

índice Agregar de esa columna:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" 
ON "table1" ("column_date" ASC) 
GO 

Luego, su búsqueda será aún más rápido:

DECLARE @p_date DATE 
SET  @p_date = CONVERT(DATE, '14 AUG 2008', 106) 

SELECT * 
FROM  table1 
WHERE column_date = @p_date 
+0

y luego, sugiero usar uno de los formatos ISO para las fechas que reconocen la mayoría de las bases de datos y no depende del idioma/localidad, como 'YYYY-MM-DD' – van

-1

En sqlserver

DECLARE @p_date DATE 

SELECT * 
FROM table1 
WHERE [email protected]_date 

En C# Pase corto cadena de valor de fecha utilizando la función ToShortDateString(). muestra: DateVariable.ToShortDateString();

1

La fecha se puede comparar en sqlserver usando la comparación de cadenas: p.

DECLARE @strDate VARCHAR(15) 
SET @strDate ='07-12-2010' 


SELECT * FROM table 
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112) 
0
SELECT * FROM tablename 
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012' 
3

que normalmente convertir fecha y hora hasta la fecha y compararlos, como los siguientes:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date) 

o

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0 
0

La mejor forma de hacerlo es simplemente extraer la parte de fecha utilizando la función SQL DATE() Función:

SELECT * 
FROM table1 
WHERE DATE(column_datetime) = @p_date; 
0

Hay muchos formatos de fecha en SQL que se están especificando. Consulte https://msdn.microsoft.com/en-in/library/ms187928.aspx

Convirtiendo y comparando la columna varchar con las fechas seleccionadas.

Sintaxis:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03' 
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy 
Cuestiones relacionadas