none
filtrar por mes y año en SQL Server RRS feed

Respuestas

Todas las respuestas

  • Vladimir Angarita,

    ¿Recibes los valores por separado o como una cadena de 7 caracteres que corresponden al mes y año: MM/yyyy?

    Vamos por un ejemplo:

    DECLARE @Periodo varchar(10) ='01/2017';
    DECLARE @FechaInicial date = CONCAT(RIGHT(@Periodo, 4), LEFT(@Periodo, 2), '01')
    
    SELECT * FROM NombreTable 
    WHERE Fecha >= @FechaInicial AND Fecha < DATEADD(MONTH, 1, @FechaInicial);
    GO

    O si tienes la versión 2012 o superior puedes hacer uso de la función DATEFROMPARTS (Transact-SQL)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 19 de enero de 2017 20:57
  • - Usando la función DATEFROMPARTS en caso obtengas los valores por separado:

    DECLARE @Anio int = 2017;
    DECLARE @Mes int = 1;
    DECLARE @FechaInicial date = DATEFROMPARTS(@Anio, @Mes, 1);
    
    /*La misma consulta que el aporte anterior*/


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 19 de enero de 2017 21:03
  • Suponiendo que ambos parametros son enteros entonces pudieras usar algo asi como:

    ...
    where
        col1 >= convert(date, convert(char(8), (((@year * 100)  + @month) * 100) + 1))
        and col1 < dateadd(month, 1, convert(date, convert(char(8), (((@year * 100)  + @month) * 100) + 1)));

    DECLARE 
    	@year int = 2016,
    	@month smallint = 7;
    
    SELECT
    	(((@year * 100)  + @month) * 100) + 1 AS col1, 
    	CONVERT(date, convert(char(8), (((@year * 100)  + @month) * 100) + 1)) AS col2,
    	DATEADD(MONTH, 1, CONVERT(date, convert(char(8), (((@year * 100)  + @month) * 100) + 1))) AS col3;
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    jueves, 19 de enero de 2017 21:04
  • Oye es verdad, mejor inicio desde el principio, veras tengo un DateTimePicker1.value, que como puedes ver en la imagen muestra el mes y año actual, pero en la propiedad value muestra fecha y hora completa, mi primera pregunta es como formateo la propiedad value del DateTimePicker1 para que solo tome el mes y el año  01/2017 y luego con esa cadena tener mi filtro para el where
    viernes, 20 de enero de 2017 14:58
  • Vladimir,

    Una opcion es enviar la fecha/tiempo tal y como la seleccionas mediante un parametro tipo datetime y luego en el procedimiento se calcula el inicio de mes y el inicio del proximo mes cada uno con a las 00:00:00 que es lo que hacemos en las sugerencias anteriores.

    DECLARE 
    	@dt datetime = GETDATE();
    
    SELECT
    	@dt AS col1, 
    	DATEADD(MONTH, DATEDIFF(MONTH, '19000101', @dt), '19000101') AS col2,
    	DATEADD(MONTH, DATEDIFF(MONTH, '19000101', @dt) + 1, '19000101') AS col3;
    GO
    

    La primera columna es la fecha, la segunda calcula el inicio de mes y la tercera el inicio del mes sgte. El resto es usar estos dos ultimos valores en la clausula WHERE.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 20 de enero de 2017 15:21
  • Vladimir Angarita,

    Si deseas tomar la primera propuesta que escribí basado en una cadena que contiene el formato 'MM/yyyy' entonces establece el mismo formato -que definiste para presentar el valor en el control DateTimePicker- para asignar el valor al parámetro.

    Dim Periodo As String = DateTimePicker1.Value.ToString("MM/yyyy")
    cmd.Parameters.AddWithValue("@Periodo", Periodo)
    'Resultado: 01/2017


    DECLARE @FechaInicial date = CONCAT(RIGHT(@Periodo, 4), LEFT(@Periodo, 2), '01')
    
    SELECT * FROM NombreTabla
    WHERE Fecha >= @FechaInicial AND Fecha < DATEADD(MONTH, 1, @FechaInicial);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 20 de enero de 2017 16:00
  • Hola gracias por tus respuestas, pero mira me esta generando un error, que podría estar sucediendo.

    viernes, 20 de enero de 2017 19:35
  • Con cual version de SQL Server trabajas?

    Esta funcion se introdujo con la version 2012.

    Puedes usar la sugerencia que te di, la cual trabaja en versiones anteriores o evita usar CONCAT y solo has una concatenacion usando "+".

    DECLARE @Periodo varchar(25) = '07/2016';
    DECLARE @FechaInicial datetime = RIGHT(@Periodo, 4) + LEFT(@Periodo, 2) + '01';
    
    SELECT @FechaInicial AS FechaInicial;
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 20 de enero de 2017 19:47
  • Vladimir Angarita,

    La función CONCAT() no está disponible para la versión del motor de SQL Server que ocupas actualmente, sin embargo puedes hacer lo mismo mediante el operador de concatenación '+':

    DECLARE @fechaTransaccion date = RIGHT(@Periodo, 4) + LEFT(@Periodo, 2) + '01'
    
    ... WHERE ColFecha >= @fechaTransaccion AND ColFecha < DATEADD(MONTH, 1, @fechaTransaccion);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 20 de enero de 2017 19:56
  • Utilizo SQl server 2008
    viernes, 20 de enero de 2017 19:58