2009-11-06 279 views
29

Tengo un campo "fecha_cargo" que quiero que esté en blanco (NULO) hasta que se haya facturado, en ese momento se ingresará la fecha.¿Cómo almacenar valores NULL en campos de fecha y hora en MySQL?

Veo que a MySQL no le gustan los valores NULL en los campos de fecha y hora. ¿Alguno de ustedes tiene una forma simple de manejar esto, o me veo obligado a usar la fecha mínima como un "equivalente NULO" y luego verificar esa fecha?

Gracias.

editar para agregar:

Ok Veo que MySQL aceptará el valor NULL, pero no va a aceptarlo como una actualización de base de datos si estoy actualizar el registro usando PHP.

El nombre de la variable es $bill_date pero no va a salir de la variable como NULL si puedo actualizar un registro sin necesidad de enviar un valor a $bill_date - Me sale este error:

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1 

Asumo que necesito en realidad enviar la palabra NULL, o dejarla fuera de la consulta de actualización para evitar este error? ¿Estoy en lo cierto? ¡¡¡Gracias!!!

+0

MySQL sí acepta valores nulos para la definición de fecha y hora, pero si por alguna razón piensa lo contrario y no usará un valor nulo, considere simplemente usando '1/1/1000' como el valor y sin incluir filas cuales tener ese valor para su columna bill_date en sus consultas. – BraedenP

+0

Mysql permite nulos en campos de fecha y hora. Sospecho que el problema proviene de la forma en que estás accediendo a mysql. ¿Podría editar su pregunta con el mecanismo que está utilizando para acceder a los datos? Por ejemplo, ¿está utilizando mi ODBC, usando una biblioteca de Perl, etc.? – anschauung

+0

Usando PHP - vea mis ediciones arriba. – rhodesjason

Respuesta

42

MySQL hace permitir NULL valores para datetime campos. Acabo de probar que:

mysql> create table datetimetest (testcolumn datetime null default null); 
Query OK, 0 rows affected (0.10 sec) 

mysql> insert into datetimetest (testcolumn) values (null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from datetimetest; 
+------------+ 
| testcolumn | 
+------------+ 
| NULL  | 
+------------+ 
1 row in set (0.00 sec) 

estoy usando esta versión:

mysql> select version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.0.45 | 
+-----------+ 
1 row in set (0.03 sec) 

editar # 1: Veo en su edición que el mensaje de error que está recibiendo en PHP indica que está de paso una cadena vacía (es decir, ''), no null. Una cadena vacía es diferente de null y no es un valor datetime válido, razón por la cual recibe ese mensaje de error. Debe pasar la palabra clave SQL especial null si eso es lo que quiere decir. Además, no coloque ninguna comilla alrededor de la palabra null. Ver mi declaración insert arriba para un ejemplo de cómo insertar null.

EDIT # 2: ¿Está utilizando PDO? Si es así, cuando vincula su parámetro nulo, asegúrese de utilizar el tipo [PDO::PARAM_NULL][1] al enlazar un null. Consulte el answer to this stackoverflow question sobre cómo insertar correctamente null usando PDO.

+0

Usando PHP - vea mis ediciones en la publicación original anterior. – rhodesjason

+0

@Jason Rhodes: Ok, he actualizado mi respuesta para abordar sus ediciones. Si aún no puede hacer que funcione, publique su código PHP. – Asaph

+0

@Jason Rhodes: He incluido algunos consejos que pueden ser útiles si está utilizando PDO. – Asaph

2

Acabo de probar en MySQL v5.0.6 y la columna de fecha y hora acepto null sin problema.

3

Depende de cómo declare su tabla. NULL no se permitiría en:

create table MyTable (col1 datetime NOT NULL); 

Pero sería permitido en:

create table MyTable (col1 datetime NULL); 

El segundo es el valor por defecto, por lo que alguien debe de haber decidido activamente que la columna no debe ser anulable.

18

Este es un punto sensato.

Una fecha nula no es una fecha cero. Pueden parecer iguales, pero no lo son. En mysql, un valor de fecha nulo es nulo.Un valor de fecha cero es una cadena vacía ('') y '0000-00-00 00:00:00'

En una fecha nula "... donde mydate = ''" fallará.
En una fecha vacía/cero "... donde mydate es nulo" fallará.

Pero ahora vamos a funky. En las fechas de mysql, la fecha vacía/cero es estrictamente la misma.

por ejemplo

 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = ''; 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = '0000-00-00 00:00:00' 

voluntad tanto de la producción: '0000-00-00 00:00:00'. si actualiza myDate con '' o '0000-00-00 00:00:00', ambas selecciones seguirán funcionando igual.

En php, el tipo de fechas nulas de mysql se respetará con el conector estándar mysql, y será nulo real ($ var === null, is_null ($ var)). Las fechas vacías siempre se representarán como '0000-00-00 00:00:00'.

Le recomiendo usar solo fechas nulas, O solo fechas vacías si puede. (algunos sistemas usarán fechas "viruales" cero que son fechas gregorianas válidas, como 1970-01-01 (linux) o 0001-01-01 (oráculo).

Las fechas vacías son más fáciles en php/mysql. No tiene que manejar el campo "where field is null." Sin embargo, debe "manualmente" transformar la fecha del "0000-00-00 00:00:00" en "" para mostrar los campos vacíos. (para almacenar o buscar no tiene un caso especial para manejar fechas cero, lo cual es bueno).

Las fechas nulas necesitan más atención. Debe tener cuidado cuando inserte o actualice NO agregue comillas alrededor de nulo, de lo contrario, la fecha cero será insertado en lugar de nulo, lo que causa los estragos de datos estándar. En los formularios de búsqueda, tendrá que manejar casos como "y mydate no es nulo", y así sucesivamente.

Las fechas nulas suelen ser más trabajos. pero ellos MUCHO MUCHO es más rápido que cero fechas para las consultas.

1

Específicamente en relación con el error que está recibiendo, no se puede hacer algo como esto en PHP para un campo anulable en MySQL:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')'; 

Debido nula en PHP será igual a una cadena vacía, que es no lo mismo que un valor NULL en MysQL. Por el contrario desea hacer esto:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')'; 

Por supuesto que no tiene que utilizar is_null pero calculo que demuestra el punto un poco mejor. Probablemente sea más seguro usar empty() o algo así. Y si $ col2 pasa a ser una cadena que incluiría entre comillas dobles en la consulta, no olvide no para incluir los que están alrededor de la cadena 'NULL', de lo contrario, no funcionará.

Espero que ayude!

+0

En el primer ejemplo, simplemente puede hacer: '$ sql = 'INSERT INTO table (col1, col2) VALUES ('. $ Col1. ', Null)';' – Pere

2

Por lo que vale: estaba experimentando un problema similar tratando de actualizar una tabla MySQL a través de Perl. La actualización fallaría cuando se pasara un valor de cadena vacío (traducido de un valor nulo de una lectura de otra plataforma) a la columna de fecha ('dtcol' en el ejemplo de código a continuación).Finalmente tuve éxito al obtener los datos actualizados utilizando una instrucción IF incrustada en mi declaración de actualización:

... 
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?'; 
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]); 
    ... 
3

Tuve este problema en Windows.

Ésta es la solución:

Para pasar '' NULL debe deshabilitar STRICT_MODE (que está activado de forma predeterminada en las instalaciones de Windows)

Por cierto que es divertido para pasar '' NULL. No sé por qué dejan este tipo de comportamiento.

0

Acabo de descubrir que MySQL tomará nulo siempre que el valor predeterminado para el campo sea nulo y escriba sentencias if específicas y dejen de lado las comillas. Esto también funciona para la actualización.

if(empty($odate) AND empty($ddate)) 
{ 
    $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' "; 
}; 
Cuestiones relacionadas