none
orden no esperado RRS feed

  • Pregunta

  • Hola a todos:

    Tengo un campo tipo date en la base de datos

    Quiero mostrar los registros ordenados ascendente o descendentemente por año y mes en formato mm+'/'+aaaa

    Que me salga

    1/2013

    2/2013

    ...

    12/2013

    1/2014

    ...

    12/2014

    ¿Cuál ha de ser la cadena a poner como orden en ambos sentidos?

    Gracias de antemano


    • Editado Volar.2013 miércoles, 9 de octubre de 2013 18:24
    miércoles, 9 de octubre de 2013 18:22

Respuestas

  • Si tienes el campo tipo [date] y este es parte del resultado de la query, entonces solo basta que ordenes el resultado por esta columna ya sea ASC o DESC.

    DECLARE @T TABLE (
    dt date NOT NULL PRIMARY KEY
    );
    
    INSERT INTO @T (dt)
    VALUES
    	('20130101'),
    	('20130201'),
    	('20131201');
    	
    SELECT
    	dt
    FROM
    	@T
    ORDER BY
    	dt ASC;
    
    SELECT
    	dt
    FROM
    	@T
    ORDER BY
    	dt DESC;
    GO

    Si estas creando una nueva columna en la query donde concatenas el mes y el año entonces asegurate que rellenas los meses con ceros por la izquierda ya que esta columna no sera tipo fecha sino de caracteres y el orden de caracteres se hace comparando caracter por caracter. Si no haces eso entonces obtendras resultados no esperados ya que la cadena '12' es menor que la cadena '2' y por lo tanto si ordenas estas dos cadens de forma ascendente obtendras '12', '2' y no '2', '12'.

    DECLARE @T TABLE (
    dt date NOT NULL PRIMARY KEY
    );
    
    INSERT INTO @T (dt)
    VALUES
    	('20130101'),
    	('20130201'),
    	('20131201');
    	
    -- orden raro
    SELECT
    	CAST(MONTH(dt) AS varchar(2)) + '/' + CAST(YEAR(dt) AS varchar(4)) AS my
    FROM
    	@T
    ORDER BY
    	my ASC;
    
    -- orden esperado
    SELECT
    	RIGHT(CONVERT(char(10), dt, 103), 7) AS my
    FROM
    	@T
    ORDER BY
    	my ASC;
    GO


    AMB

    Some guidelines for posting questions...


    miércoles, 9 de octubre de 2013 19:24