2009-10-27 32 views
64

en MySQLSQL Server datetime LIKE select?

select * from record where register_date like '2009-10-10%' 

¿Cuál es la sintaxis de SQL Server?

Gracias.

+0

¿Qué es lo que realmente quieres comprobar? ¿Que una fecha y hora determinada tiene una parte de fecha determinada? ¿O algo mas? –

+1

Para tener una discusión sana sobre esto (incluyendo por qué es malo tratar los valores 'DATETIME' como cadenas, y por qué puede ser malo utilizar' BETWEEN' o '> = AND <='), vea [este blog de Aaron Bertrand] (http://is.gd/4EgDF). –

+0

Su pregunta tiene al menos '5' votos para la etiqueta [tag: like-operator]. ¿Podría solicitar amablemente que sugiera [tag: sql-like] como [sinónimo] (http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit

Respuesta

97

se puede usar la función DATEPART()

SELECT * FROM record 
WHERE (DATEPART(yy, register_date) = 2009 
AND DATEPART(mm, register_date) = 10 
AND DATEPART(dd, register_date) = 10) 

encuentro esta manera fácil de leer, ya que ignora el componente de tiempo, y usted no tiene que usar la fecha del día siguiente a restringe tu selección. Puede ir a mayor o menor granularidad agregando cláusulas adicionales, utilizando el código DatePart apropiado, p.

AND DATEPART(hh, register_date) = 12) 

para obtener registros realizados entre el 12 y 1.

Consulte al MSDN DATEPART docs para la lista completa de los argumentos válidos.

+0

Si hay un index on register_date, esto ignorará por completo el índice y el rendimiento sufrirá. Probablemente bastante mal. –

+0

Bien, pero evita el problema de utilizar el equivalente de cadena del día posterior a la fecha en cuestión, que se sugiere en algunas de las respuestas aquí. Difícil donde la fecha en cuestión es el final del mes o año. –

+3

+1 ¿Por qué se bajó este valor? – Andomar

35

No hay soporte directo para operador LIKE contra variables de fecha y hora, pero siempre se puede echar la fecha y hora a un VARCHAR:

SELECT (list of fields) FROM YourTable 
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%' 

Compruebe el MSDN docs para obtener una lista completa de "estilos" disponibles en la función CONVERT.

Marc

+0

Esa me parece la forma * menos * deseable de manejar las fechas ... –

+0

estuvo de acuerdo, pero el OP solicitó una forma de manejar la fecha y hora con LIKE .... Pero estoy de acuerdo: las fechas se deben manejar preferiblemente con rangos como> = y <= o ENTRE ENTRE - mucho mejor enfoque –

+0

Gracias a todos. Lo siento, soy solo un novato para SQL. – Paisal

9

Si lo hace, que están obligando a realizar una conversión de cadenas. Sería mejor construir un intervalo de fechas de inicio/final, y el uso de:

declare @start datetime, @end datetime 
select @start = '2009-10-10', @end = '2009-11-10' 
select * from record where register_date >= @start 
      and register_date < @end 

Esto permitirá que utilice el índice (si hay uno en register_date), en lugar de un recorrido de tabla.

+0

Gracias. Lo siento, soy solo un novato para SQL. – Paisal

7

Puede usar CONVERT para obtener la fecha en forma de texto. Si convierte a un varchar (10), puede utilizar = en lugar de como:

select * 
from record 
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10' 

O puede utilizar una fecha superior y el límite inferior, con la ventaja añadida de que podría hacer uso de un índice:

select * 
from record 
where '2009-10-10' <= register_date 
and register_date < '2009-10-11' 
+0

Muchas gracias. – Paisal

+0

Creo que hay un error en la cláusula where, debería ser * "donde '2009-10-10'> = register_date" * –

+0

@mr_eclair: no lo creo, eso incluiría todas las fechas anteriores al 11 de octubre – Andomar

3

También puede usar convertir para hacer que la fecha se pueda buscar usando LIKE. Por ejemplo,

select convert(VARCHAR(40),create_date,121) , * from sys.objects where  convert(VARCHAR(40),create_date,121) LIKE '%17:34%' 
1

Hay una cobertura muy escamosa del operador LIKE para las fechas en SQL Server. Solo funciona usando el formato de fecha americano. A modo de ejemplo, usted podría intentar:

... WHERE register_date LIKE 'oct 10 2009%' 

He probado esto en SQL Server 2005 y funciona, pero que realmente va a necesitar probar diferentes combinaciones. cosas extrañas que he notado son:

  • Sólo parecen tener todo o nada para los distintos subcampos dentro de la fecha, por ejemplo, si se busca 'apr 2%' sólo se consigue nada en el día 20 de - omite 2da.

  • uso de un único guión bajo '_' para representar un solo carácter (comodín) no sea del todo el trabajo, por ejemplo, WHERE mydate LIKE 'oct _ 2010%' voluntad no retorno todas las fechas antes el 10 - no devuelve nada en absoluto, ¡de hecho!

  • El formato es americana rígida: 'mmm dd yyyy hh:mm'

he encontrado que es difícil de concretar un proceso para likeing segundos, por lo que si alguien quiere llevar esto un poco más lejos, adelante!

Espero que esto ayude.

6

Desafortunadamente, no es posible comparar la fecha y hora hacia varchar con 'LIKE' Pero la salida deseada es posible de otra manera.

select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0 
+0

Esto funcionó para mí. Muchas gracias –

1

LIKE El operador no funciona con componentes de fecha como el mes o la fecha, pero el operador DATEPART hace.

comando para encontrar todas las cuentas cuyo Fecha Abierta estaba en la primera:

SELECT * 
    FROM Account 
WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1` 

* CASTING OpenDt porque su valor está en DATETIME y no sólo DATE.

0

He resuelto mi problema de esa manera. Gracias por las sugerencias de mejoras. Ejemplo en C#.

string dd, mm, aa, trc, data; 
dd = nData.Text.Substring(0, 2); 
mm = nData.Text.Substring(3, 2); 
aa = nData.Text.Substring(6, 4); 
trc = "-"; 
data = aa + trc + mm + trc + dd; 

"Select * From bdPedidos Where Data Like '%" + data + "%'";