Fonctions SQL

Sur les différents SGBD, il y a une multitude de fonctions :

« Enseigner, ce n’est pas remplir un vase, c’est allumer un feu » Une phrase qui ne date pas d’hier puisqu’elle est de Montaigne …

L’objectif n’est pas de les voir toutes mais d’en utiliser certaines (si possible les plus pertinentes), pour voir les différences entre SGBD et en retenir quelques une.

Fonction sur les dates

SELECT CURDATE();--  fonction sur MYSQL (juste la date)SELECT GETDATE();-- fonction transactSQL de SQLSERVERSELECT SYSDATE();-- fonction sur ORACLESELECT CURRENT_TIMESTAMP;-- norme SQL  : fonction "système" pas de  paramètres-- (fonctionne sur MYSQL et PostGreSQL , mais pas sur ORACLE et SQLSERVER)SELECT NOW();--  fonction sur MYSQL (date+heure)
  1. Quelles sont les fonctions pour obtenir la date d’aujourd’hui sur les principaux SGBDR ?
  2. Indiquer si ces fonctions tiennent compte du fuseau horaire et le format de la date retournée.
DROP TABLE IF EXISTS TD_telephone;
CREATE TABLE TD_telephone 
(
idTelephone       INTEGER AUTO_INCREMENT  
, type_id         CHAR(2)
, marque_id       INTEGER 
, date_achat   DATE
, prix         DECIMAL (9,2)       /* NUMBER(9,2) sur ORACLE */
, proprietaire_id INTEGER
, couleur       VARCHAR(25)
, PRIMARY KEY(idTelephone)
);

INSERT INTO TD_telephone (idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id,couleur) VALUES (1,'SP' ,1,STR_TO_DATE('15/01/2020', '%d/%m/%Y'),139.99,190120,'ROUGE');
-- il est déconseillé de mettre une valeur à une clé primaire => pour vérification
INSERT INTO TD_telephone (idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id) VALUES (NULL,'SP' ,2,STR_TO_DATE('14/03/2020', '%d/%m/%Y'), 99.99,190215);
INSERT INTO TD_telephone
(idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id,couleur) VALUES
(NULL,'CL' ,3,STR_TO_DATE('02/05/2020', '%d/%m/%Y'), 49.11,190001,'NOIR');
INSERT INTO TD_telephone
(idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id,couleur) VALUES
(NULL,'CO' ,4,STR_TO_DATE('25/07/2020', '%d/%m/%Y'), 89.14,190222,'BLANC');
INSERT INTO TD_telephone
(idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id)         VALUES
(NULL,'IP' ,5,STR_TO_DATE('30/09/2020', '%d/%m/%Y'),359.49,190561);
INSERT INTO TD_telephone
(idTelephone,type_id,marque_id,date_achat,prix,proprietaire_id,couleur) VALUES
(NULL,'CO' ,5,STR_TO_DATE('01/01/2021', '%d/%m/%Y'), 99.51,122120,'BLANC'),
(NULL,'SP' ,1,'2013-01-15',189,190622,'ROUGE'),
(NULL,NULL ,NULL,'2013-01-15',20,190623,'ROUGE'),
(NULL,NULL ,1,'2013-01-15',NULL,NULL,NULL);

exemple :

-- MYSQL
SELECT date_achat, 
    YEAR(date_achat) as Annee,
    DATEDIFF(date_achat, CURDATE()) as "Difference" ,
    DATE_ADD(date_achat, INTERVAL 30 DAY) as Plus30j ,
    DATE_SUB(date_achat, INTERVAL 30 DAY) as Moins30j ,
    DATE_ADD(date_achat, INTERVAL -30 DAY) as Moins30j2    
FROM TD_telephone;

-- SQLSERVER
SELECT *, 
    YEAR(date_achat) as Annee,
    DATEDIFF(DAY, date_achat, DateDemandee) as [Difference],
    DATEADD(DAY, 30, date_achat) as Plus30j,
    DATEADD(DAY, -30, date_achat) as Moins30j
FROM TD_telephone;

-- ORACLE
SELECT *, 
    EXTRACT(YEAR FROM date_achat) as Annee,
    DateDemandee - date_achat as "Difference",
    date_achat + 30 as Plus30j,
    date_achat - 30 as Moins30j
FROM TD_telephone;

-- ADD_MONTHS(date_achat, 2)

exemple de configuration de la “time_zone”

DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
id_post  INT  AUTO_INCREMENT
, title VARCHAR(255) NOT NULL
, content LONGTEXT
, online VARCHAR(255) DEFAULT 0
, dt_created_at DATETIME  NOT NULL DEFAULT CURRENT_TIMESTAMP
, dt_updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, ts_created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
, ts_updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, PRIMARY KEY (id_post)
);

Dans la documentation, beaucoup de synonymes :

https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html