Quiero poder darle a un procedimiento almacenado un mes y un año y que devuelva todo lo que sucede en ese mes, ¿cómo hago esto ya que no puedo comparar, ya que algunos meses tienen diferentes números de días, etc.?
¿Cuál es la mejor manera de hacer esto? ¿Puedo pedir comparar según el año y el mes?
Gracias.
sql
sql-server-2008
Tarks
fuente
fuente
El uso de las funciones MES y AÑO como se sugiere en la mayoría de las respuestas tiene la desventaja de que SQL Server no podrá usar ningún índice que pueda haber en su columna de fecha. Esto puede acabar con el rendimiento en una mesa grande.
Me inclinaría a pasar un valor DATETIME (por ejemplo, @StartDate) al procedimiento almacenado que representa el primer día del mes que le interesa.
Luego puede usar
SELECT ... FROM ... WHERE DateColumn >= @StartDate AND DateColumn < DATEADD(month, 1, @StartDate)
Si debe pasar el mes y el año como parámetros separados al procedimiento almacenado, puede generar un DATETIME que represente el primer día del mes usando CAST y CONVERT y luego proceda como se indicó anteriormente. Si hace esto, recomendaría escribir una función que genere un DATETIME a partir de valores enteros de año, mes y día, por ejemplo, lo siguiente de un blog de SQL Server .
create function Date(@Year int, @Month int, @Day int) returns datetime as begin return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1) end go
La consulta entonces se convierte en:
SELECT ... FROM ... WHERE DateColumn >= Date(@Year,@Month,1) AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
fuente
@EndDate
lo hará explícito.Como alternativa a las funciones MONTH y YEAR, también funcionará una cláusula WHERE normal:
select * from yourtable where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
fuente
Más un consejo muy sencillo. También puedes usar la función to_char , mira:
Por mes:
Por año:
Por día:
La función to_char es compatible con el lenguaje SQL y no con una base de datos específica.
Espero ayudar a alguien más ...
¡Abdominales!
fuente
Si está utilizando SQL Server, busque en DATEPART.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
PARTE DE DATOS (mm, [LA FECHA QUE ESTÁS BUSCANDO])
Luego puede usar la lógica de enteros normal con él. Lo mismo para el año, solo use aa en lugar de mm.
fuente
Usted puede. Aquí hay un ejemplo simple usando la base de datos de muestra AdventureWorks ...
DECLARE @Year INT DECLARE @Month INT SET @Year = 2002 SET @Month = 6 SELECT [pch].* FROM [Production].[ProductCostHistory] pch WHERE YEAR([pch].[ModifiedDate]) = @Year AND MONTH([pch].[ModifiedDate]) = @Month
fuente
Me resulta más fácil pasar un valor como un tipo de datos temporales (por ejemplo
DATETIME
) y luego usar la funcionalidad temporal, específicamenteDATEADD
yDATEPART
, para encontrar las fechas de inicio y finalización del período, en este caso el mes, por ejemplo, esto encuentra la fecha de inicio y el par de fechas de finalización para el mes actual, simplemente reemplaceCURRENT_TIMESTAMP
su parámetro de tipoDATETIME
(tenga en cuenta que el valor 1990-01-01 es completamente arbitrario):SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-01T00:00:00.000'), DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T23:59:59.997')
fuente
Algo como esto debería hacerlo:
select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year
Alternativamente, puede dividir el mes y el año en sus propias columnas al crear el registro y luego seleccionarlas.
Iain
fuente
Una forma sería crear una variable que represente el primer día del mes (es decir, 1/5/2009), pasarla al proceso o compilarla (concatenar mes / 1 / año). Luego use la función DateDiff.
Esto devolverá cualquier cosa con un mes y año coincidentes.
fuente
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
¿Dónde
AAAA
está el año que quieres yMM
es el mes que quieres?fuente