SQL Server DateTime 参数“四舍五入”警告
技术问答
214 人阅读
|
0 人回复
|
2023-09-12
|
更多的是警告而不是问题:
' C0 ~9 Y* u1 S p; m( n我们今天早上解决了一个非常令人费解的错误。我们有各种允许用户输入他们想要运行的日期范围的报告。假设您计划从2010年8月1日到2010年8月10日报告包括 2010 年8 月 10 日,所以报告的结束日期不是8 月 10 日,而是之后.
$ }. h! D1 ?1 D2010年 11 月 8 日是不可能的,因为有些报告总结了一天中发生的一切,并将其分成午夜,所以每天的总结将包括额外的一天 - 不是我们想要的。# k$ |5 L" `8 H) D- n0 Q V8 U
为了避免在非常接近一天结束时丢失任何项目的可能性,我们将结束日期计算为比明天少一个刻度:5 Z+ a6 J- I1 \1 D; Q' ^1 m
public static DateTime EndOfDay(DateTime day){ return day.Date.AddDays(1).AddTicks(-1);}! C4 n( J4 [/ D9 l( Q9 q
最终类似于 8/10/2010 12:59:59.9999PM7 J8 @ F+ Y$ U
好吧,当你把这个 DateTime 传递给 SQL Server 中的 DATETIME 参数时,它会将值向上舍入到 8/11/2010 00:00:00!使用我们的查询
% u0 g9 ^0 l# }) H- L/ CDateField BETWEEN @FromDate AND @ToDate% w; |2 }$ H" J) x0 T' Y& ^3 o
代替$ h/ s. W3 l: h; |
1 A0 P' v9 B5 E4 V+ r! `- DateField >= @FromDate AND DateField 8/1/2010000-8/10/2010 报告包括 8/11/2010 项目。/ Z2 L C$ _* q0 F% J% m8 v# a
- 发现真正问题的唯一方法是通过字符串来回转换日期。DateTime.ToString() 也是四舍五入,所以我们最终会得到 SQL Server 8/1/2010 12:59:59PM。
* {9 \: }8 ` [4 o) g - 所以现在我们的一天结束方法看起来像这样:[code]public static DateTime EndOfDay(DateTime day){ / Cant' subtract anything smaller (like a tick) because SQL Server rounds UP! Nice,eh? return day.Date.AddDays(1).AddSeconds(-1);}
/ c3 K2 m# E; `( ]# d+ S, C( f 抱歉不是问题 - 只是觉得有人可能觉得有用。
) R' h* I: n; F1 `4 [) W
6 |- n( D- b3 k- V3 f7 `2 d$ y 解决方案: |
|
|
|
|
|