2008-10-22 9 views
10

Je planifie une application PHP qui a besoin de stocker la date et l'heure dans une base de données MSSQL. (Pour les curieux, c'est une application de calendrier.) Quel est le format préféré pour stocker cette information? MSSQL a son propre type de données datetime, qui fonctionne bien dans la base de données elle-même et est très lisible. Cependant, il n'y a pas de fonctions MSSQL pour traduire les valeurs datetime au format préféré de PHP - Timestamp UNIX. Cela rend un peu plus pénible à utiliser avec PHP. L'horodatage UNIX est attrayant parce que c'est ce que PHP aime, mais ce n'est certainement pas aussi lisible et il n'y a pas beaucoup de fonctions MSSQL intégrées pour travailler avec les données. Voulez-vous stocker ces informations en tant que type de données datetime, en tant qu'horodates UNIX (int, bigint ou varchar datatype), en tant que deux formats côte à côte ou en tant que tout autre élément?Quel est le format préféré pour stocker la date et l'heure dans une base de données SQL Server lorsque PHP est votre langue principale?

+0

PHP 5.2.0 publié le 2 novembre 2006 (deux ans avant cette question) a introduit la classe DateTime. Ceci (et ses classes et dérivés) est maintenant comment vous devez manipuler les dates et les heures en PHP. Considérez si votre anniversaire est avant 1970. Comment pouvez-vous stocker cela comme un horodatage Unix? Vous devez également savoir que _this_entier_entier n'est pas un entier normal, mais représente un horodatage Unix. Utilisez un cours qui dit ce que c'est. –

Répondre

12

Je stockerais les dates dans le format MS-SQL pour aider à utiliser pleinement les fonctions de manipulation de date dans T-SQL. Il est plus facile d'écrire et de lire

SELECT * FROM Foo 
WHERE DateDiff(d,field1,now()) < 1 

que d'essayer de réaliser l'opération équivalente en manoeuvrant entiers

Pour convertir une date MSSQL dans une utilisation d'horodatage unix DATEDIFF:

SELECT DATEDIFF(s,'1970-01-01 00:00:00',fieldName) as fieldNameTS 
FROM TableName 
WHERE fieldName between '10/1/2008' and '10/31/2008' 

Pour convertir un Un horodatage Unix dans une date MsSQL, vous pouvez soit le faire en PHP:

$msSQLDate = date("Y-m-d H:i:s", $unixDate); 

ou MsSQL

INSERT INTO TableName ( 
    fieldName 
) VALUES (
    DATEADD(s,'1970-01-01 00:00:00', ?) 
) 

Où paramètre on est int ($ unixDate)

4

Je recommande la même chose que je fais pour toutes les dates dans tous les moteurs de base de données, le type natif db. (DATETIME)

utiliser juste "AAAA-MM-JJ HH: MM: SS" pour insérer en php: date('Y-m-d H:i:s', $myTimeStampInSeconds);

-edit en réponse aux commentaires ci-dessous ici -

  1. pour les colonnes sélectionnées vous peut utiliser $timestamp = strtotime ($yourColumnValue);
  2. je recommande de conserver dans le format natif databas parce que vous pouvez ensuite utiliser SQL pour comparer les enregistrements à l'aide des fonctions de date/heure SQL comme DATEADD(), etc.
+0

L'insertion est facile, c'est l'utilisation des données après la sélection qui est plus gênant. –

+0

En outre, vous recommandez de le stocker de cette façon, mais pouvez-vous développer pourquoi vous le recommandez? –

+0

Joe Lencioni C'est plus rapide parce que c'est juste des nombres, les comparaisons sont numériques, et il n'y a aucun moyen qu'une date ultérieure d'une valeur inférieure à une précédente. Il est standardisé (ISO8601) et il n'est pas compliqué d'apporter n'importe quel type de date à ce format de chaîne (et sa conversion en entier). Alors que dans le type Date, le programme fonctionne pour convertir et faire des comparaisons – manhattan

2

Bonjour et bonne journée pour tout le monde

Oui, peut-être des thats la meilleure façon, les dates de magasin dans db, ils seront prendre le format db et vous pouvez formater quand vous avez besoin que vous Wich

Mais il y a une autre solution une dans le format international ISO-développé, je veux dire ISO 8601.

Le format international défini par ISO (ISO 8601) tente de résoudre tous les problèmes de date en définissant un système de date numérique comme suit: AAAA-MM-JJ où

YYYY est l'année [tous les chiffres, c.-à-d.2100] MM est le mois [01 (Janvier) à 12 (Décembre)] DD est le jour [01 à 31] selon les papillons de nuit: P

Utilisation de dates numériques n'ont aussi quelques écueils en matière de lisibilité et la convivialité n'est pas parfaite.Mais le format de date ISO est, cependant, le meilleur choix pour une représentation de date qui soit universellement (et précisément) compréhensible.

Notez que ce format peut également être utilisé pour représenter la date et l'heure précise, avec des informations de fuseau horaire

Voici une information détaillée sur ISO 8601: 2000

http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm

Sans plus .. Bye bye

+0

La chose que je n'aime pas dans les formats de date ISO-8601 est le "T" entre la partie date et la partie temps. Mais la bonne partie est que datetimes dans ce format trient bien comme des chaînes simples. – bart

Questions connexes