2011-02-14 42 views
23

Tengo problemas para encontrar la mejor manera de almacenar algunos datos en mi base de datos. Tengo que almacenar las fechas de DD/MM en una base de datos, pero no estoy seguro de la mejor manera de almacenar esto para que pueda ser fácilmente ordenado y buscado.Almacenamiento día y mes (sin año)

Básicamente un usuario podrá guardar fechas importantes en el formato DD/MM, que se recordarán más cerca del día.

El tipo de datos DATE no parece completamente apropiado ya que incluye el año, pero no puedo pensar en otra forma de almacenar estos datos. Sería posible incluir un año específico hasta el final de todas las ocasiones, pero esto casi no parece correcto.

+1

Lo sentimos, pero no puedo imaginar por qué tratas de evitar el año, ¿cuál es el punto de la fecha cuando no sabes el año? Pero puede usar una cadena como tipo de campo y guardar mes y día en ella –

+3

Usaría el tipo de fecha, no estaría mal tener un año presente aunque no se use, mayor flexibilidad futura, almacenamiento optimizado, etc. –

+2

@Senad I ' No estoy tratando de evitar el año, es solo que no me interesan los datos. Por ejemplo, no necesito saber que el primer Día oficial de Australia fue en 1818. Más bien, solo estoy interesado en almacenando que está en 26/1. – Sasha

Respuesta

40

Tengo que almacenar fechas dd/mm en una base de datos, pero no estoy seguro de la mejor manera de almacenar este modo que pueda ser fácilmente ordenadas y buscó.

La mejor manera de almacenar los datos de fecha, incluso si el año no se requiere de componentes, es utilizar la fecha. Cuando necesite usarlo, puede eliminar el año o reemplazarlo por el año comparado con el año actual.

Teniéndolo en la columna de la fecha facilita validar correctamente, la integridad, la validación etc.

para atender a los años bisiestos, utilice un año como '0004', que permite '0004-02-29'. Usando años 4 hace que sea un poco más complicado que el año 0, sino como un ejemplo, esto convierte a la fecha de -FEB '29'(año agnóstico) en una fecha en este año para la comparación con algún otro campo

select 
    adddate(
    subdate(cast('0004-02-29' as date), 
     interval 4 year), 
     interval year(curdate()) year) 

result: 2011-02-28 
+0

Gracias. Exactamente lo que necesitaba. – Sasha

+9

+1 para recordar los años bisiestos – benzado

+0

Mucho se necesita aquí para que los clientes registrados de nuestro CRM puedan almacenar la fecha de nacimiento en ambos formatos: dd/mm o dd/mm/aaaa. ¡Gracias! –

5

¿Estas fechas son recurrentes? Si no, ¿cómo mantendrá un registro de cuándo ha "caducado"? Si la respuesta es "la aplicación eliminará manualmente las fechas una vez que hayan expirado", ¿por qué no simplemente almacenar la fecha DD/MM como siguiente instancia disponible de esa fecha? Por ejemplo:

01/02 se convierte en 2012-02-01, y se convierte en 04\072011-07-04

El incorporada en la fecha/funciones de tiempo son tan útiles que os recomiendo no varchars uso o tinyints.

2

Si realmente desea dejar el año, solo haga DOS columnas, una por día y otra por mes. Luego guárdalos por separado.

CREATE TABLE `table-name` (
    `Day` tinyint NOT NULL, 
    `Month` tinyint NOT NULL 
); 

embargo, es mucho mejor usar sólo el tipo Date y luego ignorar el año en el código.

+0

¿Cómo contará el número de días de una fecha a otra? Necesitaría una tabla de "Mes". Sera un desastre. – ClosureCowboy

+0

@ClosureCowboy, Sí, seguramente será un desastre. Es por eso que estoy recomendando ** en contra de **. – shamittomar

+0

@ClosureCowboy, shamittomar, No hay desastre. También puede hacer el cálculo de la fecha en el lado de PHP o en el lado de MySQL (procs almacenados). – Pacerier

Cuestiones relacionadas