我在这里描述了一张表:http://sqlfiddle.com/#!3/f8852/3
时间为00:00
时的date_time字段是错误的。例如:
5/24/2013 00:00
这应该是:
5/23/2013 24:00
所以小时00:00
对应于前一天的最后一小时(我没有创建此表但必须使用它)。有没有办法快速选择我可以用00:00
代替所有日期24:00
previous day
?我可以在for循环中在python中轻松完成,但不太确定如何在sql中构造它。感谢帮助。
答案 0 :(得分: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)