MySQL中的timestampdiff()函数是否等同于SQL Server中的datediff()函数?

10

我正在将 SQL Server 2000 中的功能迁移到 MySQL。

在 SQL Server 2000 中执行以下语句,输出为 109。

SELECT DATEDIFF(wk,'2012-09-01','2014-10-01') AS NoOfWeekends1

在MySQL中,timestampdiff()datediff的等效查询函数,它的输出结果为108。

SELECT TIMESTAMPDIFF(WEEK, '2012-09-01', '2014-10-01') AS NoOfWeekends1

我需要在MySQL中执行时输出匹配,以便返回109。


有趣,可能是一个漏洞。 - Mihai
谢谢,你说得对!问题是,现在我无法修改SQL Server代码,因为它已经在应用程序中了。现在的问题是,我需要编写代码,以获得与SQL Server代码相同的结果。如果我需要使用“DAY”,那么两个应用程序都必须更改。 - user2905792
如果您需要回复用户,只有在您评论他们的帖子或在他们的用户名前使用@符号时,他们才会收到通知,例如:@Tanner。因为您在评论您的问题而不是我的答案,所以我没有收到通知。我只是因为我的答案被投票而回来,想要检查是否有任何更新。 - Tanner
@user2905792,您可以使用DAYOFWEEK()方法来检测第一/最后一天,并添加一些逻辑,如果跨越周末而没有完整的一周,则将1添加到周计数。 - Tanner
1个回答

9
我认为这可能是以下两种情况之一造成的:
  • 在SQL Server和MySQL实例之间,哪一天被归类为一周的第一天。
  • 在SQL Server和MySQL之间如何计算一周。

您提供的日期2012-09-01是星期六,这似乎排除了一周的开始日,通常是星期日或星期一。

MySQL默认的开始日期是:0(星期日)

要查找SQL Server的一周开始日期,您可以使用@@DATEFIRST运行以下命令:

select @@DATEFIRST -- default US English = 7 (Sunday)

你可以将计算方式改为按天计算,而不是按周计算并除以7来获得更准确的值,你可以根据需要进行四舍五入:
MySQL:SQL Fiddle演示
SELECT TIMESTAMPDIFF(DAY, '2012-09-01', '2014-10-01')/7 AS NoOfWeekends1


| NOOFWEEKENDS1 |
|---------------|
|      108.5714 |

SQL Server: SQL Fiddle演示:

SELECT DATEDIFF(d,'2012-09-01','2014-10-01')/7.0 AS NoOfWeekends1

| NOOFWEEKENDS1 |
|---------------|
|    108.571428 |

你可以根据是否想匹配先前结果或将其视为额外的周末来四舍五入。
SQL Server似乎按照一周的开始,计算两个日期之间星期日的数量,如此示例所示,我已将日期范围更改为2天,即一个星期六和一个星期日。
SELECT DATEDIFF(wk,'2012-09-01','2012-09-02') AS NoOfWeekends1

| NOOFWEEKENDS1 |
|---------------|
|             1 |

然而,在MySQL中相同的值似乎只会将7天作为一周来计算,如此演示所示:

SELECT TIMESTAMPDIFF(WEEK, '2012-09-01', '2012-09-02') AS NoOfWeekends1

| NOOFWEEKENDS1 |
|---------------|
|             0 |

只有在整整7天过去后,您才能得到1的结果,您可以在这个演示示例中看到:

SELECT TIMESTAMPDIFF(WEEK, '2012-09-01', '2012-09-08') AS NoOfWeekends1

| NOOFWEEKENDS1 |
|---------------|
|             1 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接