2010-06-20 3 views
0

J'essaie de mettre une valeur par défaut de "1/1/0001 12:00:00 AM" mais d'abord il ne me le permet pas.Comment définir la valeur par défaut ou la liaison pour datetime à 1/1/0001 12:00:00 AM dans SQL Server 2005?

Alors j'ai essayé de mettre "1/1/0001" mais quand je l'ai testé. Il est changé en (((1)/(1))/(1)) et quand j'essaie la valeur par défaut il me donne "01/02/1900 12:00:00 AM" je ne sais pas pourquoi.

+0

Pourquoi faites-vous cela (mettre en date insignifiante) plutôt que de simplement autoriser NULL? –

+0

Donc je n'ai pas besoin de vérifier les valeurs Null plus tard quand mon linq to sql le récupèrera (une autre vérification de l'instruction if qui pourrait être évitée). J'utilise simplement cette date pour vérifier si leur compte est toujours valide. Si, par défaut, il vaut 1900, il sera toujours invalide jusqu'à ce qu'il achète un abonnement. – chobo2

+0

Donc, à la place, vous allez faire une vérification IF pour voir si c'est 1/1/0001? Je ne comprends pas le gain. –

Répondre

2

La gamme de datetime dans SQL Server est le 1er Janvier 1753, jusqu'au 31 Décembre, 9999. Si vous voulez 1/1/0001 en tant que valeur, vous devez utiliser datetime2 dans SQL Server 2008.

+0

Ah ok bien alors je vais essayer puis 1 janvier 1753 – chobo2

+0

Ok il a changé 1/1/1753 à (((1)/(1))/(1753)) et la valeur par défaut est toujours 01/02/1900 – chobo2

+1

vous devriez utiliser "1753-01-01". – Gabe

2

Try this

CREATE TABLE MyTable (Id INT, aDate DATETIME NOT NULL DEFAULT('1753-01-01')) 

Ou, si vous voulez obtenir "fantaisie", vous pouvez essayer ceci:

CREATE DEFAULT [dbo].[DefaultDate] AS '1753-01-01' 
GO 

CREATE TYPE [dbo].[MyDate] FROM [datetime] NOT NULL 
GO 

EXEC sys.sp_bindefault 
    @defname=N'[dbo].[DefaultDate]', 
    @objname=N'[dbo].[MyDate]' 
GO 

CREATE TABLE MyTable (Id INT, aDate [MyDate] NOT NULL) 
GO 

INSERT INTO MyTable (ID) SELECT 1 
SELECT * FROM MyTable 

[EDIT] Comme Martin Smith a très bien remarqué, sp_bindefault va être supprimé dans une future version (see this). Donc, utilisez la première solution pour avoir moins de maux de tête avec les futures mises à jour.

+0

sp_bindefault est obsolète. –

1

En premier lieu, les types de données DateTime ne peuvent stocker qu'une date minimale de '1753-01-01'. Pour SmallDateTime, la date minimale est '1900-01-01'. Ce n'est pas un accident qu'ils ont choisi cette valeur. Le calendrier lui-même a changé en 1752 et donc en essayant de comparer le nombre de jours à partir de dire '1701-01-01' à maintenant est problématique en utilisant les mathématiques de date standard.

Cependant, dans SQL Server 2008, une nouvelle DateTime2 ou Date ou l'autre qui peut stocker une valeur de 0001-01-01 mais il serait erroné de le faire pour la raison que je viens de mentionner. Troisièmement, essayer d'utiliser une date arbitraire pour représenter l'absence d'une valeur de date est une erreur IMO. C'est ce que j'appelle l'approche «valeur magique» pour éviter les valeurs nulles. IMO, il complique grandement le code appelant comme le code appelant doit maintenant savoir et vérifier la valeur magique au lieu d'une valeur nulle pour savoir s'il faut afficher un blanc. Au lieu de cela, vous devez renvoyer des valeurs DateTime nullables (DateTime?) à partir de votre code LINQ et transmettre cette valeur null au niveau de présentation afin que le code de présentation puisse traiter des valeurs absentes.or

Questions connexes