0

我在这里描述了一张表:http ://sqlfiddle.com/#!3/f8852/3

时间00:00错误时的 date_time 字段。例如:

5/24/2013 00:00

这应该是:

5/23/2013 24:00

所以小时00:00对应于前一天的最后一个小时(我没有创建这个表,但必须使用它)。当我进行选择时,有没有快速的方法可以将所有日期替换为00:00时间?我可以在 python 中的 for 循环中轻松完成,但不太确定如何在 sql 中构造它。感谢帮助。24:00previous day

4

1 回答 1

4

所有日期时间都是时间的瞬间,而不是有限长度的跨度,它们只能存在于一天之内。根据定义,代表午夜的时刻是在第二天,它是一天开始的那一天,即,一天在开始时关闭,在结束时打开,或者,再次表述,有效允许单个日历日期内的时间值从 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) 
于 2013-05-24T20:19:47.650 回答