回答

收藏

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/ C
    DateField 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    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则