entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Mostrar resultados más recientes primero (caso particular)

Buenas.

Les cuestiono lo siguiente. Tengo un caso al que le quería aplicar un orden de fechas mediante ORDER BY. Logré hacerlo, pero, tengo un pequeño problemita, observen, este es un caso algo particular ya que se muestran los movimientos de una cuenta virtual (depósito de dinero y eso), y entonces tengo el código para que me muestre por fechas pero está, de alguna manera "separado" y es por eso que primero me muestra lo que tengo arriba (las salidas de dinero) y abajo las entradas de dinero omitiendo la fecha en general, es decir, no la omite pero se muestra primero lo mencionado, ¿hay manera de adaptar el código para ponerlo todo junto por fecha? Observen bien el código y notarán lo que les digo de la separación. No lee todo junto si no que el orden es por tipo de transacción (además que por la fecha, claramente).

Es decir, el error que obtengo con esto es que el depósito que le realizan a la persona en la imagen el 13/8/2015 debería mostrarse arriba de todo ya que es algo reciente, pero no, porque primero en el código coloqué que se muestren las transferencias de dinero que hizo la persona a otros. ¿Logran verlo?

enter image description here

En "Usuario" se almacena el que transfiere X dinero a "Destino". "Usuario" es quien pierde el dinero (por decirlo de alguna manera). "Destino" es quien lo recibe.

<div class="table-responsive">
                                <table class="table table-striped table-bordered table-hover">
                                    <thead>
                                        <tr>
                                            <th><center><p style="font-size:13px">Fecha</center></th>
                                            <th><center><p style="font-size:13px">DE</center></th>
                                            <th><center><p style="font-size:13px">A</center></th>
                                        <th><center><p style="font-size:13px">Movimiento</center></th>
                                        </tr>
                                    </thead>
                                    <tbody>
<?php
  $count_rows = 0;
  $sql_select = mysql_query("SELECT * FROM log_transacciones WHERE Usuario LIKE '%".$_SESSION['USER:NAME']."%' ORDER BY Fecha DESC LIMIT 0, 20 ");
  while($trans = mysql_fetch_array($sql_select))

  {
    $count_rows++;
?>
                                    <tr>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Fecha']; ?></center></td>
                                            <td><center><p style="font-size:13px">(<i>user 1<?php echo $player['numero']?></i>)</center></td>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Destino']; ?></center></td>
                                            <td><center><p style="color:red;font-size:13px">-$<?php echo number_format($trans['Cantidad'],0,",","."); ?></center></td>
                                            </td>
                                        </tr>
                                        <?php
  }
?>
<?php
  $count_rows = 0;
  $sql_select = mysql_query("SELECT * FROM log_transacciones WHERE Destino LIKE '%".$_SESSION['USER:NAME']."%' ORDER BY Fecha DESC LIMIT 0, 20 ");
  while($trans = mysql_fetch_array($sql_select))
  {
    $count_rows++;
?>
                                    <tr>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Fecha']; ?></center></td>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Usuario']; ?></center></td>
                                            <td><center><p style="font-size:13px">(<i>user 1</i>)</center></td>
                                            <td><center><p style="color:green;font-size:13px">$<?php echo number_format($trans['Cantidad'],0,",","."); ?></center></td>
                                            </td>
                                        </tr>
<?php
  }
?>
                                </tbody>
                                </table>
                            </div>

0voto

MikeNicholas comentado

Aclaro que esto lo publico sólo para mostrar más a fondo mi problema, pero quiero darle prioridad a lo hablado en los comentarios de arriba ya que me preocupa más.

Estuve probando dándole valor a Fecha desde la DB (sólo para probar, no me quedó hecho bien todavía por los motivos de arriba) y llegué a la conclusión de que, en mi otro problema que tenía (del otro tema), esto me pasaría igual si estaría solucionado:

enter image description here

0voto

Leonardo-Tadei comentado

En la query de el comentario de arriba, pareciera que estás ordenando por "Movimiento" y no por fecha... revisá eso primero (tal vez tengas una query con varios ORDER y no estés interpretando bien lo que pasa)

PD: por favor, no publiques como respuestas cosas que son comentarios a respuestas o ampliaciones a la pregunta

0voto

MikeNicholas comentado

En realidad son dos query y están por fecha, supongo:

 <div class="panel-heading">
                            <p style="text-align:center;"><b>Movimientos de cuenta</b>
                        </div>
                        <div class="panel-body">
                            <div class="table-responsive">
                                <table class="table table-striped table-bordered table-hover">
                                    <thead>
                                        <tr>
                                            <th><center><p style="font-size:13px">Fecha</center></th>
                                            <th><center><p style="font-size:13px">DE</center></th>
                                            <th><center><p style="font-size:13px">A</center></th>
                                            <th><center><p style="font-size:13px">Movimiento</center></th>
                                        </tr>
                                    </thead>
                                    <tbody>
<?php
  $count_rows = 0;
  $sql_select = mysql_query("SELECT * FROM log_transacciones WHERE Usuario LIKE '%".$_SESSION['USER:NAME']."%' ORDER BY Fecha DESC LIMIT 0, 20 ");
  while($trans = mysql_fetch_array($sql_select))
  {
    $count_rows++;
?>
                                    <tr>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Fecha']; ?></center></td>
                                            <td><center><p style="font-size:13px">(<i>CTA <?php echo $player['playerid']?>-9461-<?php echo $player['numero']?></i>)</center></td>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Destino']; ?></center></td>
                                            <td><center><p style="color:red;font-size:13px">-$<?php echo number_format($trans['Cantidad'],0,",","."); ?></center></td>
                                            </td>
                                        </tr>
                                        <?php 
  }
?>
<?php
  $count_rows = 0;
  $sql_select = mysql_query("SELECT * FROM log_transacciones WHERE Destino LIKE '%".$_SESSION['USER:NAME']."%' ORDER BY Fecha DESC LIMIT 0, 20 ");
  while($trans = mysql_fetch_array($sql_select))
  {
    $count_rows++;
?>
                                    <tr>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Fecha']; ?></center></td>
                                            <td><center><p style="font-size:13px"><?php echo $trans['Usuario']; ?></center></td>
                                            <td><center><p style="font-size:13px">(<i>CTA <?php echo $player['playerid']?>-9461-<?php echo $player['numero']?></i>)</center></td>
                                            <td><center><p style="color:green;font-size:13px">$<?php echo number_format($trans['Cantidad'],0,",","."); ?></center></td>
                                            </td>
                                        </tr>
<?php 
  }
?>
                                    </tbody>
                                </table>
                            </div>
                            </div>

0voto

white comentado

Tu campo lo mantienes como varchar? o declinaste por dejarlo como DATE como bien te sugiere @Leonardo-Tadei ?

en el caso de que tengas un tipo VARCHAR podrias hacer esto: (no aconsejable)

ORDER BY STR_TO_DATE(Fecha,'%Y-%m-%d')

para el formato yyyy-mm-dd

cual es la consulta donde insertas los datos? podrías agregar ese código? intenta validar la fecha antes de ingresarla a la base de datos, no es php el lenguaje que usas para insertar en la base de datos? entonces intenta darnos el que usas especificamente.

1voto

Leonardo-Tadei comentado

Pero @MikeNicholas !

Si tenés 2 querys, cada resultado se ordenará independientemente del otro!

No sabemos las estructuras de las tablas ni tenemos el contexto, pero por lo que se ve, estás queriendo mostrar 2 resultados de 2 querys distintas con los datos ordenados como si fuera una sola query.

Lo que tenés que hacer es una sola query que muestre todo...

0voto

MikeNicholas comentado

He intentado con lo tuyo white pero me sigue igual, aquí un código similar al que uso para guardar la fecha de esto, sólo que con otra función, pero es el mismo formato:

        format(query, sizeof(query), "INSERT INTO `Log_Baneos` (Administrador, Baneado, Fecha,Motivo) VALUES ('%s','%s','%d/%d/%d','%s')",pName2,pName,day,month,year,ADMIN);
        mysql_function_query(Conecction, query, true, "OnQueryFinish", "ii", 0, playerid);
        format(query, 200, "UPDATE `usuarios` SET `Baneado`='1' WHERE `Username`='%s'", pName);
        mysql_function_query(Conecction, query, true, "OnQueryFinish", "ii", 0, playerid);
        SetTimerEx("TiempoBan",500,false,"d",ID);
        return 1;

Las fechas son llevadas a la DB a través del lenguaje Pawn que está basado en C++.

No sabría cuanta más información poner, he dejado los códigos y todo, pero no termino de entender bien esto, es bastante lioso

http://i.imgur.com/0pywy89.png

enter image description here

0voto

white comentado

según la supuesta documentación del lenguaje que dices usar, entonces deberías usar un formato para hacer un pad left:

reemplaza esto:

VALUES ('%s','%s','%d/%d/%d','%s')

por esto:

VALUES ('%s','%s','%02d/%02d/%d','%s')

y nos cuentas que sucedió

https://wiki.sa-mp.com/wiki/Format

0voto

MikeNicholas comentado

Eso no me dará problemas? No puedo tomar la opción de ponerlo IGUAL al formato que usa DATE por defecto en MYSQL? Es decir mandar igual el valor con el formato, así:

yyyy-mm-dd

Tendría que usar esto?

'%d/%02d/%02d'

0voto

MikeNicholas comentado

Y supongo que también cambiar esto: day,month,year por esto: year,month,day verdad?

0voto

white comentado

si, es tal como dices.

si el formato deseado es yyyy-mm-dd

entonces el formato es: %d/%02d/%02d y los argumentos en el orden año, mes, dia. de la misma forma que trabaja printf en php o C/C++.

2 Respuestas

3votos

Leonardo-Tadei Puntos227320

Seguramente estás usando el cambpo fecha en formato VARCHAR en vez de en formato DATE en la DB.

Si bien para la representación interna ambos se guardan como texto, el DATE te fuerza a ser riguroso en el formato de la fecha y no tendrás este problema.

El formato en que MySQL guarda las fechas es yyyy-mm-dd y luego lo podés convertir para que se muestre de otra forma.

Saludos cordiales!

PD: es el mismo problema que en tu pregunta anterior

0voto

MikeNicholas comentado

Hola Leonardo, gracias por responder a mis preguntas. Te comento que cambié los formatos a DATE, estaban como decías vos. Pero ahora me quedaron con el formato que especificaste (0000-00-00 exactamente) y no se muestran los valores que necesitaría. ¿Cómo podría convertir el formato al siguiente que es el que actualmente uso?

día/mes/año

Debo aclarar que los días y meses, en el formato que realicé no tienen los "0" adelante, es decir, en lugar de decir mes 06, dice mes 6. Así igual con los días.

Otra vez más, gracias. Espero una respuesta. Saludos.

0voto

MikeNicholas comentado

P.D.: Te escribo por acá porque no me dejó loguear en la que hice la pregunta.

0voto

MikeNicholas comentado

Encontré acá este apartado pero no sabría bien que digitar:

enter image description here

1voto

Leonardo-Tadei comentado

Para que en la DB no te quede guardado 0000-00-00 tenés que pasarle a MySQL la fecha en el formato correcto.

Si le permitís al usuario cargar "20/1/1980", tenés que convertir eso que está en formato dd/mm/yyyy a yyyy-mm-ddd, por ejemplo así:

function strToDate($f) {                // 17/02/2005 a 2005-02-17
        $tmp = explode('/', $f );
        if( count($tmp) != 3 ) {
            throw new Exception("Fecha inválida: debe ingresar dd/mm/yyyy ");
        }
        if( ! checkdate($tmp[1], $tmp[0], $tmp[2]) ){
            throw new Exception("Fecha inválida: no existe esa fecha");
        }
        // Formatea
        $d = str_pad($tmp[0], 2, '0', STR_PAD_LEFT);
        $m = str_pad($tmp[1], 2, '0', STR_PAD_LEFT);

        return $tmp[2]."-$m-$d";
    }

$date = strToDate($_POST["fecha"]);

y cuando la vas a mostrar, hacer el proceso inverso, es decir, convertir yyyy-mmm-dd en dd/mm/yyyy ... para lo que te dejo a vos como ejercicio hacer la función "dateToStr()" inspirándote en el código anterior.

Saludos!

0voto

MikeNicholas comentado

Disculpá la ignorancia si estoy comentándote algo incorrecto, pero, digamos que la obtención de la fecha en un principio no es a través de una web ni PHP, si no que es aplicada por un juego que utiliza otro lenguaje de programación directamente en la DB usando el formato mencionado anteriormente (dd/mm/yyyy, sin ceros en los días y meses). A lo que voy con esto, ¿me serviría el código que me enviaste? Según entiendo sólo aplicaría en mi caso si la obtención principal de la fecha la haría mediante el sitio web, pero no. ¿Es así? ¿En ese caso qué debería hacer? Porque intenté ingresar un valor de ejemplo o prueba en la base de datos con el formato dd/mm/yyyy y el campo DATE pero me salta un error, claramente porque no estoy usando el formato yyyy-mm-ddd. Una vez más, te pido disculpas si hasta acá no me hallo ni voy entendiendo muy bien, hago todo lo posible pero nunca traté con este tema de las fechas, formatos y demás. El código no lo entiendo muy bien tampoco. Te agradezco por tomarte el tiempo de responder acá, un saludo.

0voto

MikeNicholas comentado

Me gustaría saber si existe, en mi posición, algún metodo accesible a este inconveniente que estoy teniendo, o si sería más aconsejable directamente desde el código del juego (que está en otro lenguaje) mandar a la DB la fecha con el formato de ésta (yyyy-mm-dd). ¿Funcionaría?

0voto

Leonardo-Tadei comentado

Da lo mismo en dónde y en qué lenguaje hagas la conversión. Te puse código PHP porque está como lenguaje en las etiquetas de tu pregunta.

Lo que tenés que conseguir es que:

  • el usuario ingrese 20/4/2015 y se guarde 2015-04-20
  • un 2015-04-20 se vea como 20/4/2015

0voto

MikeNicholas comentado

Voy a intentarlo pero lo veo bastante difícil, apenas me lo enviaste intenté colocar el código y me dio algunos errores, he estado revisándolo. ¿En qué parte más o menos debería colocarlo del código para que no me de más inconvenientes? Y tras eso, ¿debería crear lo otro? un 2015-04-20 se vea como 20/4/2015, ¿no serías tan amable de darme una introducción o explicación del código? Gracias y disculpa

0voto

Leonardo-Tadei comentado

El código de la función, tenes que ponerlo al principio del script.

La llamada a la función, pasándole como parámetro el varlor que ingresa el usuario (que en el ejemplo lo pongo como $_POST["fecha"] pero que tenés que poner lo que corresponda a tu script) lo tenés que usar para asignar el valor convertido a una variable, y luego usar esa variable para guardar el valor en la tabla.

0voto

MikeNicholas comentado

Bien, acabo de, al parecer, adaptar bien el código y no da ningún error, pero bueno, lógicamente sigue todo igual. Ahora según vos lo próximo que debería hacer es "usar esa variable para guardar el valor en la tabla...". ¿Si no es molestia me podrías dar más información de ésto?

0voto

Leonardo-Tadei comentado

Unformación sobre cómo hacer el INSERT ?

Suponiendo que tengas cargados en variables los datos a insertar: $dato1, $dato2, $dato3, $dato4 en el que $dato2 es la fecha:

...
$fecha = strToDate($dato2);
...
$sql = "INSERT INTO Tabla set campo1='$dato1', campo2='$fecha', campo3='$dato3', campo4='$dato4' ";
...

Es decir, hacés la query para insertar de la misma manera que ahora, pero le pasás el valor de la fecha convertida a yyyy-mm-dd

Posiblemente no esté entendiendo la pregunta, porque hacer el INSERT con una variable modificada no debería ser un problema para adaptar al código que ya tenés escrito...

PD: de todas formas, luego de poner las fecha como corresponde, etndrás que unificar en una sola query la consulta por el problema expresado en el comentario de esta pregunta.

1voto

blaDDI Puntos2260
class Functions{
    public function get_SqlDate( $pDate='//' ){
        if((intval(strlen($pDate)))>=2){
            list($D,$M,$A)=(explode('/',trim($pDate)));
            return ($A.'-'.$M.'-'.$D);
        }else{$A=$M=$D=''; return'';}
    }

    public function get_StrDate( $pDate, $pFormat='d/m/Y' ){
        $pDate = date_create($pDate);
        return date_format($pDate,$pFormat);
    }
}

Yo uso las siguientes funciones para dar el formato que quiero

La primera función te devuelve en formato yyyy-mm-dd
La segunda función te devuelve en formato dd-mm-yyyy

$oFn = new Functions();
echo $oFn->get_SqlDate('01/01/2015');
echo '<br>';
echo $oFn->get_StrDate('2015-01-01');

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta