仅在 SQL Server 2005 中存储日期

问题描述 投票:0回答:8

如何避免在 SQL Server 中存储

datetime
的时间部分,即如果我的值为
2011-01-01 00:00:00.000
我只想存储
2011-01-01

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

sql sql-server sql-server-2005 tsql
8个回答
8
投票

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



2
投票

最简单的解决方案就是不向用户公开时间部分。但是,如果您真的需要确保只存储日期部分,则可以在存储值之前将时间部分强制为午夜/正午/任何恒定时间。


1
投票

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

趣事:我曾经看到一个数据库,里面有一个日期和一个时间字段,都存储了日期和时间,但是每个只用了一半的数据。有些人做傻事:)


1
投票

如果将 DateTime 转换为 Int 并返回,您将获得一个以 00:00 作为时间部分的 DateTime。 因此,您可以将所有日期保存为数据库中的整数。


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)

,在您的 dateonly 列上制作一个

CHECK
以在有人尝试插入非截断值时引发错误:

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

1
投票

只需将日期表示为

yyyMMdd
整数值。


0
投票

我遇到了与原始帖子相同的问题,并且非常愚蠢地将我的日期表设置为 varchars() 而不是 datetime,然后使用正斜杠存储日期。当然,现在日期比较运算符将不起作用。然而,有趣的是我发现如果我简单地用破折号替换正斜杠,那么比较运算符就可以正常工作。所以现在,至少对我来说,只存储日期是可能的,方法是使用 varchar 并将日期存储为字符串,使用破折号(例如,12-01-2023)。我不知道为什么会这样,但确实如此。

© www.soinside.com 2019 - 2024. All rights reserved.