2009-08-24 165 views
5

如何避免在SQL Server中存储datetime的时间部分,即如果我的值为2011-01-01 00:00:00.000我只想存储2011-01-01仅在SQL Server 2005中存储日期

我想确保只有日期部分存储。

回答

7

DateTime数据类型总是存储日期和时间。因此,您只需使用CONVERT/CAST来获取特定格式,或者根据您的需要使用YEAR(),MONTH()或DAY()方法来隔离日期详细信息。

+0

或者你可以忽略列的时间部分,并让它默认。只要确保只在插入/更新值时才提供日期。 – 2009-08-24 17:45:34

2

最简单的解决方案就是不公开时间部分给用户。但是,如果确实需要确保仅存储日期部分,则可以在存储该值之前将时间部分强制为午夜/正午/任意一个固定时间。

1

内置的DATETIME数据类型存储日期和时间数据。如果你只指定日期部分,那么时间将是12:00:00或类似的东西。

滑稽的故事:我看到了一个数据库,一旦那里有一个日期和时间字段,无论是存储日期和时间,但每次只使用了一半的数据。有些人做的愚蠢的事情:)

1

如果你投一个DateTime为int和背部你会得到一个DateTime以00:00的一段时间。 因此,您可以将所有日期保存为数据库中的整数。

+0

如果您将'DateTime'投入到'INTEGER',它会将'DateTime'四舍五入到最接近的午夜。您需要首先投射到“FLOAT”然后投射到“INTEGER”。 – Quassnoi 2009-08-24 17:30:17

+0

你是对的。我一定是在中午之前试过这个(并且运行了所有的单元测试)。 – idstam 2009-08-25 10:17:35

1

无论是添加计算列:

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

或截断上插入你的约会权:

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

,使得CHECK您dateonly列,以提高一个错误,当有人试图插入非截断值:

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

只是表示日期为yyyMMdd整数值。