2009-08-24 7 views
5

Comment éviter de stocker la partie de temps d'un datetime dans SQL Server, c'est-à-dire si j'ai la valeur 2011-01-01 00:00:00.000 Je souhaite stocker uniquement 2011-01-01?Stockage de la date Uniquement dans SQL Server 2005

Je souhaite m'assurer que seule la partie date est enregistrée.

Répondre

4

.

7

Le type de données DateTime stocke TOUJOURS la date et l'heure. Il vous reste donc à utiliser CONVERT/CAST pour obtenir un format particulier, ou utilisez les méthodes YEAR(), MONTH() ou DAY() pour isoler les détails de date en fonction de vos besoins.

+0

Ou vous pouvez simplement ignorer la partie heure de la colonne et la laisser par défaut. Assurez-vous de ne nourrir que les dates lorsque vous insérez/mettez à jour des valeurs. –

2

La solution la plus simple consiste simplement à ne pas exposer la partie temps à l'utilisateur. Cependant, si vous devez vraiment vous assurer que seule la partie de date est stockée, vous pouvez forcer la partie heure à minuit/midi/toute heure constante avant de stocker la valeur.

1

Le type de données DATETIME intégré stocke à la fois les données de date et d'heure. Si vous spécifiez seulement la partie date, l'heure sera 12:00:00 ou quelque chose comme ça. Drôle histoire: J'ai vu une base de données une fois où il y avait un champ date et heure, les deux stockaient la date et l'heure, mais chacun a été utilisé uniquement pour la moitié des données. Certaines personnes font des bêtises :)

1

Si vous lancez un DateTime vers un Int et retour, vous obtiendrez un DateTime avec 00:00 comme partie de l'heure. Vous pouvez donc enregistrer toutes vos dates en tant qu'entier dans la base de données.

+0

Si vous lancez un 'DateTime' sur un' INTEGER', il arrondira le 'DateTime' au minuit le plus proche. Vous devez d'abord lancer 'FLOAT' puis' INTEGER'. – Quassnoi

+0

Vous avez tellement raison. Je dois avoir essayé cela (et a couru tous mes tests unitaires) avant midi. – idstam

1

Soit ajouter une colonne calculée:

dateonly AS CONVERT(DATETIME, CONVERT(CHAR(8), date_with_time, 112), 112) 

ou tronquer votre date droit à l'insertion:

INSERT 
INTO  mytable (dateonly) 
VALUES CONVERT(DATETIME, CONVERT(CHAR(8), GETDATE(), 112), 112) 

, faisant un CHECK sur votre colonne DATEONLY pour soulever une erreur lorsque quelqu'un tente d'insérer un valeur non tronquée:

CHECK (dateonly = CONVERT(DATETIME, CONVERT(CHAR(8), date_with_time, 112), 112)) 
0

Représentez-vous la date comme yyyMMdd valeur entière.

Questions connexes