Ver Mensaje Individual
  #9 (permalink)  
Antiguo 06/11/2015, 01:43
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Id por rango de fechas con php

[OFF-TOPIC]

También puedes hacerlo con código SQL puro:

Código MySQL:
Ver original
  1. INSERT INTO tabla (campo) VALUES (
  2.     IF ((SELECT COUNT(*) FROM tabla AS alias1) > 0 AND SUBSTRING((SELECT campo FROM tabla AS alias2 ORDER BY campo DESC LIMIT 1), 1, 5) = YEAR(CURDATE()),
  3.         CONCAT(
  4.             YEAR(CURDATE()),
  5.             '-',
  6.             CONVERT(
  7.                 SUBSTRING((SELECT campo FROM tabla AS alias3 ORDER BY campo DESC LIMIT 1), 6),
  8.                 UNSIGNED INTEGER
  9.             ) + 1
  10.         ),
  11.         CONCAT(YEAR(CURDATE()), '-', 1)
  12.     )
  13. )

Ahora, la explicación. En el espacio del valor a insertar, evalúo una condición. Si hay registros en la tabla (más de cero) y el año del último registro guardado es igual al año de la fecha actual, guardo el resultado de concatenar al año de la fecha actual con un guion y el valor que se encuentra a la derecha del guion del último registro guardado (ubicado en la posición 6 de dicho registro), al cual convierto a entero para sumarle uno. De esta manera, se convierte en el siguiente registro con respecto al último guardado, siempre dentro del mismo año. En el caso de que la condición no se cumpla, es decir, de que la tabla esté vacía o de que el año del último registro no coincida con el año actual (lo cual quiere decir que ya estamos en un nuevo año), guardo el resultado de concatenar al año de la fecha actual con un guion y el número 1. Para esta segunda parte, si fuera el primer caso, en el que la tabla estuviera vacía, se convertiría en el primer registro de la tabla, y si fuera el segundo caso, en el que nos encontramos en un nuevo año, se convertiría en el primer registro del año. De esta forma, quedan cubiertos todos los posibles casos.

La estructura de la condición es la siguiente:

Código MySQL:
Ver original
  1. IF (condición, verdadero, falso)

Para este ejemplo utilicé las siguientes funciones:
  • COUNT(): Devuelve la cantidad de registros en la tabla para el campo especificado. Si se le pasa un asterisco (*) como argumento, se tomará en cuenta a todos los campos.
  • CONCAT(): Permite concatenar valores.
  • CURDATE(): Devuelve la fecha actual.
  • YEAR(): Devuelve el año de la fecha pasada como parámetro.
  • CONVERT(): Devuelve el valor pasado como argumento convertido al tipo especificado como segundo parámetro.
  • SUBSTRING(): Toma una parte de una cadena, la cual se pasa como primer argumento, siendo el segundo la posición de la cadena desde la cual se tomará la porción. Puede haber un tercer argumento para definir la posición final de la porción. Las posiciones se empiezan a contar desde el 1.

Como el valor a guardar poseerá un guion, el campo ya no puede seguir siendo de tipo entero; debe ser de tipo cadena. Asigno diferentes alias a la tabla en las subconsultas para evitar conflictos con la sentencia principal. Si no lo haces así, se producirá el error #1093, el cual ocurre cuando se intenta consultar una tabla que está siendo modificada, como sucede en los casos de inserción, actualización y eliminación de datos.

Para mayores detalles, consulta el manual.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 07/11/2015 a las 19:35 Razón: Enlaces y mejora