visor studio servicio registros puede pudo mssqlserver management log iniciar inicia error equipo consultar conectar automaticamente archivo aparece sql sql-server tsql

studio - Obtenga los registros del mes pasado en el servidor SQL



visor del archivo de registros sql server (17)

Quiero obtener los registros del mes pasado basados ​​en el campo de la tabla db [miembro] "date_created".

¿Cuál es el sql para hacer esto?

Para aclaración, el mes pasado - 1/8/2009 a 31/8/2009

Si hoy es 3/1/2010, tendré que obtener los registros del 1/12/2009 al 31/12/2009.


Agregue las opciones que se han proporcionado hasta el momento no usarán sus índices en absoluto.

Algo así hará el truco, y hará uso de un índice sobre la mesa (si existe).

DECLARE @StartDate DATETIME, @EndDate DATETIME SET @StartDate = dateadd(mm, -1, getdate()) SET @StartDate = dateadd(dd, datepart(dd, getdate())*-1, @StartDate) SET @EndDate = dateadd(mm, 1, @StartDate) SELECT * FROM Member WHERE date_created BETWEEN @StartDate AND @EndDate


Consulta SQL para obtener el registro del mes actual solamente

SELECT * FROM CUSTOMER WHERE MONTH(DATE) = MONTH(CURRENT_TIMESTAMP) AND YEAR(DATE) = YEAR(CURRENT_TIMESTAMP);


El mes pasado, considere como hasta el último día del mes. 31/01/2016 aquí el último día del mes sería el 31 de enero, que no es similar a los últimos 30 días.

SELECT CONVERT(DATE, DATEADD(DAY,-DAY(GETDATE()),GETDATE()))


En servidor Sql durante el último mes:

select * from tablename where order_date > DateAdd(WEEK, -1, GETDATE()+1) and order_date<=GETDATE()


La forma en que resolví un problema similar fue agregando Month a mi porción SELECT

Month DATEADD(day,Created_Date,''1971/12/31'') As Month

y que agregué la instrucción WHERE

Month DATEADD(day,Created_Date,''1971/12/31'') = month(getdate())-1


Puede obtener los registros del último mes con esta consulta

SELECT * FROM dbo.member d WHERE CONVERT(DATE, date_created,101)>=CONVERT(DATE,DATEADD(m, datediff(m, 0, current_timestamp)-1, 0)) and CONVERT(DATE, date_created,101) < CONVERT(DATE, DATEADD(m, datediff(m, 0, current_timestamp)-1, 0),101)


Soy de Oracle env y lo haría así en Oracle:

select * from table where trunc(somedatefield, ''MONTH'') = trunc(sysdate -INTERVAL ''0-1'' YEAR TO MONTH, ''MONTH'')

Idea: estoy ejecutando un informe programado del mes anterior (desde el día 1 hasta el último día del mes, sin ventana). Esto podría ser poco amigable con los índices, pero Oracle tiene un manejo rápido de las fechas de todos modos. ¿Hay una manera simple y corta similar en MS SQL? La respuesta que compara el año y el mes por separado parece tonto para la gente de Oracle.


Todas las respuestas (de trabajo) existentes tienen uno de dos problemas:

  1. Ignorarán los índices en la columna que se busca
  2. La voluntad (potencialmente) seleccionar datos que no están destinados, corrompiendo silenciosamente sus resultados.

1. Índices ignorados:

En su mayor parte, cuando una columna que se busca tiene una función invocada (que incluye implícitamente, como para CAST ), el optimizador debe ignorar los índices en la columna y buscar en cada registro. Aquí hay un ejemplo rápido:

Estamos lidiando con marcas de tiempo, y la mayoría de los RDBMS tienden a almacenar esta información como un valor creciente de algún tipo, generalmente un recuento long o BIGINTEGER de milisegundos / nanosegundos. La hora actual se ve / se almacena así:

1402401635000000 -- 2014-06-10 12:00:35.000000 GMT

Usted no ve el valor ''Año'' ( ''2014'' ) allí, ¿verdad? De hecho, hay un poco de matemática complicada para traducir de ida y vuelta. Por lo tanto, si llama a cualquiera de las funciones de extracción / fecha en la columna de búsqueda, el servidor debe realizar todas las operaciones matemáticas para descubrir si puede incluirla en los resultados. En las tablas pequeñas esto no es un problema, pero a medida que disminuye el porcentaje de filas seleccionadas, se convierte en un drenaje cada vez más grande. Entonces, en este caso, lo haces por segunda vez para preguntar acerca del MONTH ... bueno, ya entiendes la imagen.

2. Datos no deseados:

Dependiendo de la versión particular de SQL Server y de los tipos de datos de columna, el uso de BETWEEN (o rangos de límites superiores inclusivos similares: <= ) puede hacer que se seleccionen los datos incorrectos . Esencialmente, usted puede terminar incluyendo datos desde la medianoche del "próximo" día, o excluyendo alguna porción de los registros del día "actual".

Lo que deberías estar haciendo:

Entonces, necesitamos una forma que sea segura para nuestros datos, y usaremos índices (si es viable). La forma correcta es entonces de la forma:

WHERE date_created >= @startOfPreviousMonth AND date_created < @startOfCurrentMonth

Dado que solo hay un mes, @startOfPreviousMonth puede sustituirse / derivarse fácilmente por:

DATEADD(month, -1, @startOCurrentfMonth)

Si necesita derivar el mes de inicio de corriente en el servidor, puede hacerlo a través de lo siguiente:

DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)

Una palabra rápida de explicación aquí. El DATEDIFF(...) inicial DATEDIFF(...) obtendrá la diferencia entre el comienzo de la era actual ( 0001-01-01 - AD, CE, lo que sea), esencialmente devolviendo un entero grande. Este es el recuento de meses hasta el comienzo del mes actual . Luego agregamos este número al comienzo de la era, que es al comienzo del mes dado.

Así que su secuencia de comandos completa podría / debería ser similar a la siguiente:

DECLARE @startOfCurrentMonth DATETIME SET @startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0) SELECT * FROM Member WHERE date_created >= DATEADD(month, -1, @startOfCurrentMonth) -- this was originally misspelled AND date_created < @startOfCurrentMonth

Por lo tanto, todas las operaciones de fecha solo se realizan una vez, en un valor; el optimizador es libre de usar índices, y no se incluirán datos incorrectos.


Una forma de hacerlo es usar la función DATEPART :

select field1, field2, fieldN from TABLE where DATEPART(month, date_created) = 4 and DATEPART(year, date_created) = 2009

devolverá todas las fechas en abril. Para el mes pasado (es decir, previo al mes actual) también puede usar GETDATE y DATEADD :

select field1, field2, fieldN from TABLE where DATEPART(month, date_created) = (DATEPART(month, GETDATE()) - 1) and DATEPART(year, date_created) = DATEPART(year, DATEADD(m, -1, GETDATE()))


DECLARE @StartDate DATETIME, @EndDate DATETIME SET @StartDate = DATEADD(mm, DATEDIFF(mm,0,getdate())-1, 0) SET @EndDate = DATEADD(mm, 1, @StartDate) SELECT * FROM Member WHERE date_created BETWEEN @StartDate AND @EndDate

Una actualización a la solución de mrdenny, de esta manera se obtiene exactamente el mes pasado de YYYY-MM-01


DECLARE @StartDate DATETIME, @EndDate DATETIME SET @StartDate = dateadd(mm, -1, getdate()) SET @StartDate = dateadd(dd, datepart(dd, getdate())*-1, @StartDate) SET @EndDate = dateadd(mm, 1, @StartDate) set @StartDate = DATEADD(dd, 1 , @StartDate)


DECLARE @StartDate DATETIME, @EndDate DATETIME SET @StartDate = DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0) SET @EndDate = dateadd(dd, -1, DATEADD(mm, 1, @StartDate)) SELECT * FROM Member WHERE date_created BETWEEN @StartDate AND @EndDate

y otra actualización a la solución de mrdenny.
También proporciona el último día exacto del mes anterior.


DECLARE @curDate INT = datepart( Month,GETDATE()) IF (@curDate = 1) BEGIN select * from Featured_Deal where datepart( Month,Created_Date)=12 AND datepart(Year,Created_Date) = (datepart(Year,GETDATE())-1) END ELSE BEGIN select * from Featured_Deal where datepart( Month,Created_Date)=(datepart( Month,GETDATE())-1) AND datepart(Year,Created_Date) = datepart(Year,GETDATE()) END


SELECT * FROM Member WHERE DATEPART(m, date_created) = DATEPART(m, DATEADD(m, -1, getdate())) AND DATEPART(yyyy, date_created) = DATEPART(yyyy, DATEADD(m, -1, getdate()))

Necesita verificar el mes y el año.


WHERE date_created >= DATEADD(MONTH, DATEDIFF(MONTH, 31, CURRENT_TIMESTAMP), 0) AND date_created < DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)


declare @PrevMonth as nvarchar(256) SELECT @PrevMonth = DateName( month,DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0)) + ''-'' + substring(DateName( Year, getDate() ) ,3,4)


select * from [member] where DatePart("m", date_created) = DatePart("m", DateAdd("m", -1, getdate())) AND DatePart("yyyy", date_created) = DatePart("yyyy", DateAdd("m", -1, getdate()))