所有日期时间都是时间的瞬间,而不是有限长度的跨度,它们只能存在于一天之内。根据定义,代表午夜的时刻是在第二天,它是一天开始的那一天,即,一天在开始时关闭,在结束时打开,或者,再次表述,有效允许单个日历日期内的时间值从 00:00:00.00000 到 23:59:59.9999 不等。
这类似于要求一小时内的分钟值允许从 1 到 60,而不是从 0 到 59,并且 60 的值是前一小时的最后一分钟。
你说的只是显示问题。即使您可以将日期输入为 2013 年 1 月 1 日 24:00,(24:00:00 不是一天中的合法时间),它也会在 1 月 2 日开始时输入日期时间,而不是在结束时1 月 1 日
。说明这一点的一件事是注意,由于四舍五入(SQL 只能将日期时间解析为大约 300 毫秒内),如果您创建的日期时间仅在午夜前几毫秒,它将四舍五入到午夜并移至第二天,通过在企业管理器中运行以下命令可以看出...
Select cast ('1 Jan 2013 23:59:59.999' as datetime)
SQL 服务器将所有日期时间存储为两个整数,一个表示自 1900 年 1 月 1 日以来的天数,另一个表示自午夜以来的滴答数(1 个滴答是 1/300 秒,约 3.33 毫秒)。如果从午夜开始的时间间隔为零,则仍然是同一天,而不是前一天。
如果您一直在假设午夜 00:00:00 表示一天结束的情况下插入数据,那么您需要解决这个问题。
如果您需要更正现有数据,则需要在数据库中以午夜作为时间分量的每个日期添加一天(即,时间分量为零)。
Update tbale set
date_time = dateAdd(day, 1, date_time)
Where date_time = dateadd(day, datediff(day, 0, date_time), 0)