none
Prevenir que se ingrese una fecha incorrecta con respecto a un dia de la semana? RRS feed

  • Pregunta

  • Tengo una tabla en la cual hay que ingresar un día de la semana y una fecha por cada registro. Lo que necesito es una manera de verificar que la fecha que se ingresa coincida con el día de la semana.

    Ejemplo: Si yo ingreso "Lunes" y de fecha ingreso '27/11/2017' Esto estaría perfecto. Pero si yo de fecha ingreso '26/11/2017' quisiera que el ingreso del registro se cancele, por que esa fecha es un Domingo, no un Lunes.

    Antes de que alguien diga, no, no puedo cambiar los días de la semana por Números en vez de nombres, por que si no los registros quedan menos entendibles para un usuario casual, y esa idea no me simpatiza mucho....

    Alguien podría darme una idea sobre esto?

    martes, 7 de noviembre de 2017 19:58

Respuestas

  • Quieres hacer la verificación en SQL?

    por ejemplo si haces la verificación en c# antes de llamar el INSERT o UPDATE de SQL sería:

    string nombresemana1 = "Martes";
                string datestring = "07/11/2017";
                DateTime d = DateTime.Parse(datestring);
                int diasemana = (int)d.DayOfWeek;
                DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), diasemana.ToString());
                string nombresemana2 = string.Format(CultureInfo.GetCultureInfo("es-ES").DateTimeFormat.GetDayName(day));
                if (nombresemana1.ToLower() == nombresemana2.ToLower())
                    MessageBox.Show("GRABAR");
                else
                    MessageBox.Show("NO GRABAR");

    martes, 7 de noviembre de 2017 21:05
  • Puede ser que la configuración regional difiera en ambos equipos, por ejemplo, bien sea el sistema operativo o el SQL Server puede estar en español en uno de ellos y en inglés en el otro. Si fuera así, debería poderse soslayar el problema escribiendo expresamente el SET LANGUAGE y SET DATEFORMAT al principio de la instrucción.

    miércoles, 8 de noviembre de 2017 17:02

Todas las respuestas

  • Quieres hacer la verificación en SQL?

    por ejemplo si haces la verificación en c# antes de llamar el INSERT o UPDATE de SQL sería:

    string nombresemana1 = "Martes";
                string datestring = "07/11/2017";
                DateTime d = DateTime.Parse(datestring);
                int diasemana = (int)d.DayOfWeek;
                DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), diasemana.ToString());
                string nombresemana2 = string.Format(CultureInfo.GetCultureInfo("es-ES").DateTimeFormat.GetDayName(day));
                if (nombresemana1.ToLower() == nombresemana2.ToLower())
                    MessageBox.Show("GRABAR");
                else
                    MessageBox.Show("NO GRABAR");

    martes, 7 de noviembre de 2017 21:05
  • Es una idea bastante mala. Esa comprobación pertenece al código cliente, no a la base de datos. En la base de datos, para que quede normalizada, no se deben salvar datos que sean redundantes. Y en este caso, el día de la semana es redundante porque siempre se puede inferir a partir de la fecha. En consecuencia, no se debería grabar en la tabla el día de la semana, sino que lo debe calcular el código cliente (es trivial escribir una Select que te devuelva la fecha y además el día de la semana, podrías incluso dejar esa select dentro de una Vista si es que el programa cliente lo necesita).

    No obstante, si a pesar de todo tienes que hacerlo, métele a la tabla una restricción CHECK que compare el día de la semana introducido con el resultado de convertir la fecha en día de la semana:

    CHECK(diasemana = DATENAME(dw, fecha))

    Recuerda antes ejecutar un SET LANGUAGE... para especificar el idioma utilizado para el día de la semana, de manera que DateName devuelva el texto correcto.

    • Propuesto como respuesta Willams Morales martes, 7 de noviembre de 2017 21:12
    martes, 7 de noviembre de 2017 21:09
  • Esto no me funciono. Si bien puse el idioma en español (Set language Español) Ahora el check no me deja ingresar ningun registro incluso si el dia está escrito correctamente (Si pongo Miércoles 8/11 no me deja continuar a pesar de que esto está bien)
    miércoles, 8 de noviembre de 2017 12:34
  • Pidele que te lo escriba, por ejemplo, haciendo:

    SET LANGUAGE Spanish

    PRINT DATENAME(dw, CAST('08/11/2017' AS DATETIME))

    a ver que es lo que escribe, no vaya a ser que te escriba otra cosa que no sea 'Miércoles'.

    Ojo con el formato de la fecha: Observa que he puesto "08/11" y no "11/08". Al cambiar a Spanish se cambia el formato predeterminado (podrias forzar otro distinto con SET DATEFORMAT).

    Ojo tambien con los acentos, de forma predeterminada es sensible a acentos, por lo que 'Miércoles' no es igual que 'Miercoles'.

    miércoles, 8 de noviembre de 2017 14:57
  • Ok... he llegado a una situación extraña.

    Resulta ser que el Check funciona perfectamente en mi computadora de escritorio... pero en mi portatil no! La verdad que no entiendo que sucede

    miércoles, 8 de noviembre de 2017 16:40
  • Puede ser que la configuración regional difiera en ambos equipos, por ejemplo, bien sea el sistema operativo o el SQL Server puede estar en español en uno de ellos y en inglés en el otro. Si fuera así, debería poderse soslayar el problema escribiendo expresamente el SET LANGUAGE y SET DATEFORMAT al principio de la instrucción.

    miércoles, 8 de noviembre de 2017 17:02