2012-03-27 21 views
18

Esto es probablemente un simple cláusula where pero quiero decir, desde Columnx (que es de fecha y hora) Quiero que todas las filas donde sólo el año 2010. =SQL seleccionar * de la columna donde el año 2010 =

manera:

select * from mytable where Columnx = 
+0

Alguna información adicional: http://stackoverflow.com/questions/7870943/how-efficient-is-the-yeardate-function – Simon

Respuesta

26
select * from mytable where year(Columnx) = 2010 

relacionadas con el uso de índices (respondiendo el comentario de Simon):

si tiene un índice en Columnx, SQL Server no va a usar si se utiliza la función "año" (o cualquier otra función)

Hay dos soluciones posibles para ello, se está haciendo la búsqueda por intervalo como Columnx> = '01012010' y Columnx < = '31122010' y otra es crear una columna calculada con el año (Columnx) de expresión, índice, y luego hacer el filtro en esta nueva columna

+0

Si el rendimiento no es hasta cero, creo que este método no utiliza ningún índice en la columna 'Columnx' – Simon

+1

@simon - Tiene razón, al envolver una columna en una función no se puede sargaminar. Esto da como resultado un escaneo completo. Yo nunca haría esto. Es una práctica muy pobre para filtrar fechas. Recomiendo encarecidamente que el OP mire su respuesta. – MatBailie

+0

Hola @simon, gracias por tu comentario, agregué más explicaciones sobre el asunto. Simplemente no lo hice antes porque dado que OP tiene problemas muy simples con la función Year(), no me imaginaba que se preocupara por el uso de índices en este momento. – Diego

5

T-SQL y otros;

select * from t where year(Columnx) = 2010 
+3

envolver una columna en una función que hace que no sargable . Esto da como resultado un escaneo completo. Yo nunca haría esto. Es una práctica muy pobre para filtrar fechas. Recomiendo encarecidamente que el OP mire la respuesta de @simon. – MatBailie

21

Si entiendo que desea que todas las filas en el año 2010, entonces:

select * 
    from mytable 
where Columnx >= '2010-01-01 00:00:00' 
     and Columnx < '2011-01-01 00:00:00' 
+2

+1 - Hace lo que el OP quiere *** y *** hace uso de índices para una búsqueda de rango, que puede ser órdenes de magnitud más rápido que las otras respuestas aquí hasta ahora. – MatBailie

+3

Sí, +1 para permitir el uso de índices.También podría simplificar la condición a: 'donde Columnx> = '2010-01-01' y Columnx <'2011-01-01'' (sin ninguna diferencia en la eficiencia, solo unos pocos caracteres de código menos :) –

1

su justo sencilla

select * from myTable where year(columnX) = 2010 
+1

Envoltura de un la columna en una función lo hace no sargable. Esto da como resultado un escaneo completo. Yo nunca haría esto. Es una práctica muy pobre para filtrar fechas. Recomiendo encarecidamente que el OP mire la respuesta de @simon. – MatBailie

0

NB: En caso de que desee el año que se basa en una fecha de referencia, el código de abajo calcula las fechas para la between declaración:

declare @referenceTime datetime = getutcdate() 
select * 
from myTable 
where SomeDate 
    between dateadd(year, year(@referenceTime) - 1900, '01-01-1900')      --1st Jan this year (midnight) 
    and dateadd(millisecond, -3, dateadd(year, year(@referenceTime) - 1900, '01-01-1901')) --31st Dec end of this year (just before midnight of the new year) 

Del mismo modo, si usted está utilizando un valor de año, el intercambio year(@referenceDate) para su el valor del año de referencia trabajará

declare @referenceYear int = 2010 
select * 
from myTable 
where SomeDate 
    between dateadd(year,@referenceYear - 1900, '01-01-1900')      --1st Jan this year (midnight) 
    and dateadd(millisecond, -3, dateadd(year,@referenceYear - 1900, '01-01-1901')) --31st Dec end of this year (just before midnight of the new year) 
Cuestiones relacionadas