¿Comparar una cadena de fecha con fecha y hora en SQL Server?
-
08-06-2019 - |
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.)
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();