Pregunta

En SQL Server tengo un DATETIME columna que incluye un elemento de tiempo.

Ejemplo:

'14 AUG 2008 14:23:019'

Cuál es el mejor ¿Método para seleccionar solo los registros de un día en particular, ignorando la parte de tiempo?

Ejemplo:(No es seguro, ya que no coincide con la parte de tiempo y no devuelve filas)

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

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Nota:Dado que este sitio también trata sobre anotar notas y técnicas que aprendes y luego olvidas, voy a publicar mi propia respuesta a esta pregunta, ya que el tema DATETIME en MSSQL es probablemente el tema que más busco en SQLBOL.


Actualizar Ejemplo aclarado para ser más específico.


Editar Lo siento, pero tuve que modificar las respuestas INCORRECTAS (respuestas que devuelven resultados incorrectos).

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

@wearejimbo: ¡Cerca, pero sin cigarro! insignia que se le otorgó.Se perdió los registros escritos el 14/08/2008 23:59:001 a 23:59:999 (es decir,Menos de 1 segundo antes de la medianoche.)

¿Fue útil?

Solución

Técnica 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 esto es que utilizará cualquier índice en 'column_datetime' si existe.

Otros consejos

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  

@Chico.Creo que descubrirá que esta solución se adapta perfectamente.Echa un vistazo a plan de ejecución de consultas de su consulta original.

Y para mío:

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)

¿Algo como esto?

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

Técnica 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 lo esté (o es poco probable que se use el índice), entonces usar DATEDIFF() es más corto.

Buen punto sobre el índice en la respuesta que aceptó.

Aún así, si realmente buscas sólo en áreas específicas DATE o DATE ranges a menudo, entonces la mejor solución que encontré es agregar otra columna calculada persistente a su tabla que solo contendría el DATE, y agregue índice en esta columna:

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

Agregue índice en esa columna:

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

Entonces tu búsqueda será aún más rápida:

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

SELECT   *
FROM     table1
WHERE    column_date = @p_date

Esta función Reparto(Piso(Reparto(GetDate() Como Flotante)) Como FechaHora) devuelve un tipo de datos de fecha y hora con la parte de tiempo eliminada y podría usarse 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

Cómo obtener la parte FECHA de un campo DATETIME en MS SQL Server:

Una de las formas más rápidas y sencillas de hacerlo es utilizar

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

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

Tampoco expone la implementación interna de 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)

Obtener la fecha de hace 1 año

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

Normalmente convierto fecha-hora en fecha y las comparo, como estas:

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

Sé que no es exactamente así como quieres 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'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

Esto convertirá el tiempo de datos y la cadena en varchars del formato "AAAA-MM-DD".

Esto es muy feo, pero debería funcionar.

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

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
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

La mejor manera es simplemente extraer la parte de la fecha usando la función SQL DATE():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

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

Convertir y comparar 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

en el servidor sql

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

En C# pase la cadena corta de valor de fecha usando la función ToshortDateString ().muestra:FechaVariable.ToShortDateString();

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top