如何避免在 SQL Server 中存储
datetime
的时间部分,即如果我的值为 2011-01-01 00:00:00.000
我只想存储 2011-01-01
?
我想确保只存储日期部分。
DateTime 数据类型总是存储日期和时间。因此,您只能使用 CONVERT/CAST 来获取特定格式,或者根据您的需要使用 YEAR()、MONTH() 或 DAY() 方法来隔离日期详细信息。
最简单的解决方案就是不向用户公开时间部分。但是,如果您真的需要确保只存储日期部分,则可以在存储值之前将时间部分强制为午夜/正午/任何恒定时间。
内置的 DATETIME 数据类型存储日期和时间数据。如果您只指定日期部分,那么时间将为 12:00:00 或类似时间。
趣事:我曾经看到一个数据库,里面有一个日期和一个时间字段,都存储了日期和时间,但是每个只用了一半的数据。有些人做傻事:)
如果将 DateTime 转换为 Int 并返回,您将获得一个以 00:00 作为时间部分的 DateTime。 因此,您可以将所有日期保存为数据库中的整数。
要么添加一个计算列:
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))
只需将日期表示为
yyyMMdd
整数值。
我遇到了与原始帖子相同的问题,并且非常愚蠢地将我的日期表设置为 varchars() 而不是 datetime,然后使用正斜杠存储日期。当然,现在日期比较运算符将不起作用。然而,有趣的是我发现如果我简单地用破折号替换正斜杠,那么比较运算符就可以正常工作。所以现在,至少对我来说,只存储日期是可能的,方法是使用 varchar 并将日期存储为字符串,使用破折号(例如,12-01-2023)。我不知道为什么会这样,但确实如此。