【问题标题】:datediff roundingdatediff 舍入
【发布时间】:2011-02-27 07:16:34
【问题描述】:

我在 SQL Server 中有一个 db 表,其中包含项目的开始日期。

在网络状态页面上,我想显示项目运行了多少天/周/月,单位取决于持续时间。因此,在 21 天以内我会显示天数,在 7 周以内我会显示数周,否则会显示已完成的月数。所以我得到了天、周和月的值,然后可以使用一些代码来决定显示哪一个。

假设项目于 2010 年 12 月 30 日开始,我今天(2011 年 2 月 27 日)正在检查。

select datediff(d,'30 Dec 2010',getdate()) as days, 
datediff(wk,'30 Dec 2010',getdate()) as weeks , 
datediff(m,'30 Dec 2010',getdate())as months

生产

days: 59    weeks: 9    months: 2

但实际上差值是整整 8 周,并且会进行一些舍入。

我也尝试在 ASP 中执行此操作,获取开始日期,然后执行 datediff(),但效果并不好。

有没有更好的办法?

谢谢

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    DATEDIFF 使用日期部分的边界。所以对于“天”来说,今天 23:59 是明天 00:01 之前的一整天。

    这些类型的计算最好使用相同的单位。

    ;WITH cDayDiff AS
    (
       select datediff(day,'20101230',getdate()) as days
    )
    SELECT
       days / 7 as weeks, --integer division
       days % 7 as remainingdays
    FROM
       cDayDiff
    

    月份比较复杂,因为每个月都不一样。但是您可以比较天数(每月)来更正该值。

    SELECT
      datediff(month, '20101230', getdate()) -
         CASE WHEN DATEPART(day, '20101230') > DATEPART(day, getdate()) THEN 1 ELSE 0 END 
     as months
    

    【讨论】:

    • 我正在寻找这个非常好的!
    • 这不是错误的吗?如果给定日期早于当前日期,则必须减去 1,如下所示:... - CASE WHEN DATEPART(day, '20101230') < DATEPART(day, getdate()) THEN 1 ELSE 0 END
    【解决方案2】:
    select datediff(d,'30 Dec 2010',getdate()) as days,
    datediff(d,'30 Dec 2010',getdate())/7 as weeks
    

    这会给您 8 周的时间。您可以除以 7.0 得到小数。在这种情况下,您会得到 8.428571

    【讨论】:

      【解决方案3】:

      如果您想要实际计算天、周和月的日历,我认为您最好的选择是在 custom CLR SQL Server function. 中使用 NodaTime

      NodaTime 是 Java 库 JodaTime 的 .NET 端口。 JodaTime非常全面;它支持八种不同的日历系统,甚至可以考虑闰年。

      以下是 JodaTime 的简短介绍:
      http://technology.amis.nl/blog/5604/introducing-joda-time-the-smart-date-api

      【讨论】:

        【解决方案4】:

        您可能要将代码复制/粘贴到圆形DATEDIFF

        但请稍等!!!

        如果你需要这样的东西:

        IF DATEDIFF(MONTH, @dateInPast, @today) > @monthes
        

        我建议使用这样的东西:

        IF @today > DATEADD(MONTH, @monthes, @dateInPast)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-13
          • 2021-08-08
          • 2019-07-02
          • 1970-01-01
          • 1970-01-01
          • 2012-06-19
          • 2021-11-05
          相关资源
          最近更新 更多