now - mysql datetime(3)




Comment définir une valeur par défaut pour une colonne MySQL Datetime? (16)

Bien que vous ne puissiez pas faire cela avec DATETIME dans la définition par défaut, vous pouvez simplement incorporer une instruction select dans votre instruction d'insertion comme ceci:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Notez le manque de citations autour de la table.

Pour MySQL 5.5

Comment définir une valeur par défaut pour une colonne MySQL Datetime?

Dans SQL Server, c'est getdate() . Quel est l'équivalent pour MySQL? J'utilise MySQL 5.x si c'est un facteur.


C'est mon exemple de déclencheur:

/************ ROLE ************/
drop table if exists `role`;
create table `role` (
    `id_role` bigint(20) unsigned not null auto_increment,
    `date_created` datetime,
    `date_deleted` datetime,
    `name` varchar(35) not null,
    `description` text,
    primary key (`id_role`)
) comment='';

drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
    on `role`
    for each row 
    set new.`date_created` = now();


J'ai été capable de résoudre cela en utilisant cette déclaration alter sur ma table qui avait deux champs datetime.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Cela fonctionne comme vous vous attendez à ce que la fonction now () fonctionne. L'insertion de valeurs NULL ou l'ignorance des champs created_dt et updated_dt donne une valeur d'horodatage parfaite dans les deux champs. Toute mise à jour de la ligne modifie le fichier updated_dt. Si vous insérez des enregistrements via le navigateur de requête MySQL, vous avez besoin d'un pas de plus, un déclencheur pour gérer le created_dt avec un nouvel horodatage.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

Le déclencheur peut être ce que vous voulez. J'aime juste la convention de nommage [trig] _ [my_table_name] _ [insert]


Je cours MySql Server 5.7.11 et cette phrase:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

ne fonctionne pas . Mais ce qui suit:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

fonctionne juste .

En tant que sidenote , il est mentionné dans les documents mysql :

Le type DATE est utilisé pour les valeurs avec une partie de date mais aucune partie de temps. MySQL récupère et affiche les valeurs DATE au format 'AAAA-MM-JJ'. La plage prise en charge est '1000-01-01' à '9999-12-31'.

même s'ils disent aussi:

Les valeurs DATE, DATETIME ou TIMESTAMP non valides sont converties en la valeur "zéro" du type approprié ('0000-00-00' ou '0000-00-00 00:00:00').


MySQL ( avant la version 5.6.5 ) n'autorise pas l'utilisation de fonctions pour les valeurs DateTime par défaut. TIMESTAMP ne convient pas en raison de son comportement étrange et n'est pas recommandé pour une utilisation en tant que données d'entrée. (Voir Paramètres de type de données MySQL .)

Cela dit, vous pouvez accomplir cela en créant un déclencheur .

J'ai une table avec un champ DateCreated de type DateTime. J'ai créé un déclencheur sur cette table "Avant l'insertion" et " SET NEW.DateCreated=NOW() " et cela fonctionne très bien.

J'espère que cela aide quelqu'un.


Pour moi, l'approche de déclenchement a fonctionné le mieux, mais j'ai trouvé un problème avec l'approche. Considérez le déclencheur de base pour définir un champ de date à l'heure actuelle sur l'insertion:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

C'est généralement génial, mais dites que vous voulez définir le champ manuellement via l'instruction INSERT, comme ceci:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Qu'est-ce qui se passe, c'est que le déclencheur écrase immédiatement votre valeur fournie pour le champ, et donc la seule façon de définir un temps non-courant est une instruction UPDATE de suivi - beurk! Pour remplacer ce comportement lorsqu'une valeur est fournie, essayez ce déclencheur légèrement modifié avec l'opérateur IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Cela donne le meilleur des deux mondes: vous pouvez fournir une valeur pour votre colonne de date et cela prendra, et sinon, il sera par défaut à l'heure actuelle. C'est toujours ghetto par rapport à quelque chose de propre comme DEFAULT GETDATE () dans la définition de la table, mais on s'en rapproche!


Pour tous ceux qui utilisent la colonne TIMESTAMP en tant que solution, je souhaite supprimer la limitation suivante du manuel:

dev.mysql.com/doc/refman/5.0/en/datetime.html

"Le type de données TIMESTAMP a une plage de '1970-01-01 00:00:01' UTC à ' 2038-01-19 03:14:07 ' UTC. Il a des propriétés variables, selon la version de MySQL et le SQL Le serveur est en cours d'exécution. Ces propriétés sont décrites plus loin dans cette section. "

Donc, cela va évidemment casser votre logiciel dans environ 28 ans.

Je crois que la seule solution du côté de la base de données est d'utiliser des déclencheurs comme mentionné dans d'autres réponses.


Prenons par exemple Si j'avais une table nommée 'site' avec une colonne created_at et une colonne update_at qui étaient à la fois DATETIME et qui ont besoin de la valeur par défaut de now, je pourrais exécuter le SQL suivant pour y parvenir.

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME  NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT  NULL;

La séquence d'instructions est importante car une table ne peut pas avoir deux colonnes de type TIMESTAMP avec les valeurs par défaut de CUREENT TIMESTAMP


Si vous essayez de définir la valeur par défaut comme NOW (), MySQL soutient que vous devez changer le type de cette colonne TIMESTAMP au lieu de DATETIME. TIMESTAMP a la date et l'heure actuelles par défaut..je pense que cela va résoudre votre problème ..


Si vous essayez de définir la valeur par défaut comme NOW (), je ne pense pas que MySQL supporte cela. Dans MySQL, vous ne pouvez pas utiliser une fonction ou une expression comme valeur par défaut pour n'importe quel type de colonne, à l'exception de la colonne de type de données TIMESTAMP, pour laquelle vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut.


Voici comment le faire sur MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Je n'ai aucune idée pourquoi vous devez entrer le nom de la colonne deux fois.


Vous pouvez résoudre l'horodatage par défaut. Considérons d'abord quel jeu de caractères vous utilisez par exemple si vous avez pris utf8 ce jeu de caractères supporte toutes les langues et si vous avez pris laten1 ce jeu de caractères ne supporte que l'anglais. Si vous travaillez sous n'importe quel projet, vous devez connaître le fuseau horaire du client et sélectionner votre zone client. Cette étape est obligatoire.


Vous pouvez utiliser now () pour définir la valeur d'une colonne datetime, mais gardez à l'esprit que vous ne pouvez pas l'utiliser comme valeur par défaut.



IMPORTANT EDIT: Il est maintenant possible de réaliser ceci avec les champs DATETIME depuis MySQL 5.6.5 , jetez un oeil à l' autre poste ci-dessous ...

Les versions précédentes ne peuvent pas faire cela avec DATETIME ...

Mais vous pouvez le faire avec TIMESTAMP:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

** CAVEAT: SI vous définissez une colonne avec CURRENT_TIMESTAMP ON par défaut, vous devrez TOUJOURS spécifier une valeur pour cette colonne ou la valeur se réinitialisera automatiquement à "now ()" lors de la mise à jour. Cela signifie que si vous ne voulez pas que la valeur change, votre instruction UPDATE doit contenir "[votre nom de colonne] = [votre nom de colonne]" (ou une autre valeur) ou la valeur deviendra "now ()". Bizarre, mais vrai. J'espère que ça aide. J'utilise 5.5.56-MariaDB **


CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

Dans la requête ci-dessus pour créer 'testtable', j'ai utilisé '1999-12-12 12:12:12' comme valeur par défaut pour la colonne DATETIME colname





datetime