【问题标题】:did not get perfect answer with datediffdatediff 没有得到完美的答案
【发布时间】:2014-09-30 11:58:45
【问题描述】:

Datediff 对于获取两天之间的差异非常混乱:

DATEDIFF(DAY, '2014-09-01','2014-09-07')+1) AS totaldays

当我在上面写的时候,它会给我 7 天,这是完美的....

但是当我写下面的时候

DATEDIFF(DAY, '2014-09-01','2014-09-02')+1) AS totaldays

那么它会给我 2 天的时间,但我希望 1 day 具有以下功能

 DATEDIFF(DAY, '2014-09-01','2014-09-02')+1) AS totaldays

我怎样才能得到它?

【问题讨论】:

  • 请解释你想要的逻辑。如果第一个表达式正确计算 7,我希望第二个表达式正确计算 2。也许您应该使用更多日期示例和要计算的差异来编辑您的问题。
  • 但我想写 1 天 datediff(day,'2014-09-01','2014-09-01-02')....
  • 你确实有一天会用这种表达方式。当你添加一个时它会变成两个。
  • 没有解决办法吗?
  • 解释你的逻辑,01 - 07 是 6,你加一个所以它给你 7,01 - 02 是 1 你加 1 = 2。你想在这里做什么?如果您想使用几种“datediff”类型(具有不同的逻辑),我建议使用CASE WHEN

标签: sql sql-server sql-server-2008


【解决方案1】:

DATEDIFF 函数按预期工作。

DATEDIFF 只是用第一个参数中指定的特定元素从第三个参数中减去第二个参数。

例如,以下查询提供了四列...所有这些列都从第三个参数中指定的日期减去第二个参数中指定的日期:

Select DATEDIFF(DAY, '2014-09-01','2014-09-07')+1,  -- Calculation: (7-1)+1  = 7
       DATEDIFF(DAY, '2014-09-01','2014-09-07'),    -- Calculation: (7-1)    = 6
       DATEDIFF(DAY, '2014-09-01','2014-09-02')+1,  -- Calculation: (2-1)+1  = 2
       DATEDIFF(DAY, '2014-09-01','2014-09-02')     -- Calculation: (2-1)    = 1

而且结果如预期:

Col1 | Col2 | Col3 | Col4
 7   |   6  |  2   |   1

Here 是这个函数的 MS 文档。

如果您希望函数以不同的方式运行,则需要使用CASE 语句。

【讨论】:

    【解决方案2】:

    “天”有一个“持续时间”(可以用 24 小时等单位来衡量)

    • 持续时间从 00:00:00 +0000 开始
    • 当我们将日期/时间写为“2014-09-07”时,假定时间为 00:00:00 +0000

    这样:DATEDIFF(DAY, '2014-09-01','2014-09-07')

    正在测量“2014-09-01 的开始”到“2014-09-07 的开始”之间的持续时间,并且;试图将其表示为一组持续时间,其中“S”表示起点,“---”是可数持续时间。

      1   2   3   4   5   6   7 (day of the month)
    S---S---S---S---S---S---S   (time span)
    

    计算那个时间跨度中“---”的数量(6)[起点数量“S”为7]

    DATEDIFF() 测量的是“持续时间”而不是起点的数量

    您需要做的是在较高的日期上加一天,而不是在结果上加一,因为您使用的是“开始”而不是“结束”时间点。

                      from          to
                    start of     start of
    DATEDIFF(DAY, '2014-09-01','2014-09-08') = 7
    DATEDIFF(DAY, '2014-09-01','2014-09-07') = 6
    DATEDIFF(DAY, '2014-09-01','2014-09-06') = 5
    DATEDIFF(DAY, '2014-09-01','2014-09-05') = 4
    DATEDIFF(DAY, '2014-09-01','2014-09-04') = 3
    DATEDIFF(DAY, '2014-09-01','2014-09-03') = 2
    DATEDIFF(DAY, '2014-09-01','2014-09-02') = 1
    DATEDIFF(DAY, '2014-09-01','2014-09-01') = 0
    

    【讨论】:

      【解决方案3】:

      从您的 SQL 中删除 +1。

      使用以下语句:DATEDIFF(DAY, '2014-09-01','2014-09-02') AS totaldays

      由于 +1 输出错误。

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 2020-01-06
        • 2018-12-08
        • 2022-01-17
        相关资源
        最近更新 更多