【问题标题】:DATEADD using a decimal - workarounds?使用小数的 DATEADD - 解决方法?
【发布时间】:2012-01-05 14:29:27
【问题描述】:

我正在尝试执行以下操作(我已经简化了问题,尝试解决这个单独的部分)。

PRINT DATEADD(week, 0.2,  GETDATE())

由于 dateadd 的 number 参数被截断为 int,我意识到这将不起作用。

我正在尝试想出一种将 0.2 转换为小时数的方法,然后能够使用类似的东西(我认为它与小时一样准确)。

PRINT DATEADD(hour, X,  GETDATE())

任何想法如何开始?我发现很难找到任何东西来在另一个日期部分中获得一个日期部分的十进制表示。

它必须是一个基于集合的性能查询。

理论上我必须做到这样才能使用小数年,但我将作为一个单独的问题来解决......

【问题讨论】:

  • 一周的0.2 是什么意思?
  • 嗨@Oded 好点,我想一天 0.5 会是一个更好的例子,我需要增加 12 小时。我的问题域是我需要将定义的两部分标准的 10% 添加到日期。例如1 天的 10%,或 1 年的 10%,甚至 3 周的 10%。棘手吧?!我开始头疼了!

标签: tsql datetime dateadd


【解决方案1】:

1 周 = 7 天 = 168 小时 = 10080 分钟

0.2 周 = 2016 分钟

PRINT DATEADD(minute, 2016, GETDATE())

要让它工作多年,你可以写一个User Defined Function,你可以在其中输入年的小数,然后乘以分钟,然后使用minutes运行DATEADD

【讨论】:

  • 有趣的感谢 Curt 为我很好地简化了它 - 我正在解决的问题很容易变得不堪重负!所以我想对于我的问题域,我需要传入一个数字,它是类型(例如天、月、年),然后将其转换为小时......很酷,这不应该是棘手的......现在让我们看看如果我能把它塞进我的 SQL :-)
  • 这原则上应该可行,所以+1。 但是,多年来,请注意闰年!
【解决方案2】:

这是我想出的,因为它对任何人都有用。 Curt 帮助我睁开眼睛,我的问题实际上并不像我最初想象的那么复杂。我已将 Curt 的答案标记为解决方案,但这里有一些示例代码。值得注意的是 10% 不在我最初的问题中,但它说明了为什么我需要小数。

DECLARE @DatePart int,
        @DateNumber int;

SET @DatePart = 1
SET @DateNumber = 1                         

PRINT
    DATEADD(
                hour,
                CEILING
                (           
                    CASE @DatePart
                        WHEN 1 THEN @DateNumber * 24.000000 --days
                        WHEN 2 THEN @DateNumber * 168.000000 --weeks
                        WHEN 3 THEN @DateNumber * 730.484398 --months
                        WHEN 4 THEN @DateNumber * 8765.81277 --years
                    END / 100.000000 * 10.000000
                ),
                GETDATE()
            ) 

【讨论】:

  • 嗨@Curt这是我想出的,谢谢你的帮助。 :-)
  • 不用担心,很高兴为您提供帮助:)
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2012-08-25
相关资源
最近更新 更多