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

use*_*792 6 mysql sql-server datediff sql-server-2000

我正在努力将功能从SQL Server 2000迁移到MySQL.

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

SELECT DATEDIFF(wk,'2012-09-01','2014-10-01') AS NoOfWeekends1
Run Code Online (Sandbox Code Playgroud)

在mysql中使用的等效查询timestampdiff()代替datediff并将输出提供为108.

SELECT TIMESTAMPDIFF(WEEK, '2012-09-01', '2014-10-01') AS NoOfWeekends1
Run Code Online (Sandbox Code Playgroud)

我需要输出在MySQL中执行时匹配,因此返回109.

Tan*_*ner 7

我认为这可能是由两件事之一引起的:

  • 什么被归类为SQL Server和MySQL实例之间的一周的第一天.
  • SQL Server和MySQL之间的计算周数

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

MySQL的默认开始日期为: 0 (Sunday)

要查找本周的SQL Server开始,您可以通过运行以下命令来使用@@ DATEFIRST:

select @@DATEFIRST -- default US English = 7 (Sunday)
Run Code Online (Sandbox Code Playgroud)

您可以将计算更改为在几天而不是几周工作并除以7以获得更准确的值,您可以随意舍入:

MySQL:SQL小提琴演示

SELECT TIMESTAMPDIFF(DAY, '2012-09-01', '2014-10-01')/7 AS NoOfWeekends1


| NOOFWEEKENDS1 |
|---------------|
|      108.5714 |
Run Code Online (Sandbox Code Playgroud)

SQL Server:SQL小提琴演示:

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

| NOOFWEEKENDS1 |
|---------------|
|    108.571428 |
Run Code Online (Sandbox Code Playgroud)

您可以向上或向下舍入,具体取决于您是否要匹配以前的结果或将其计为额外周末.

SQL Server似乎计算了2个日期之间的星期日(如果这是一周的开始),如此示例小提琴所示,我将日期范围更改为2天,星期六和星期日:

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

| NOOFWEEKENDS1 |
|---------------|
|             1 |
Run Code Online (Sandbox Code Playgroud)

MySQL中的相同值似乎只计算一周的整整7天,如此演示小提琴所示:

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

| NOOFWEEKENDS1 |
|---------------|
|             0 |
Run Code Online (Sandbox Code Playgroud)

只有在完整的7天过去后,你才能得到1的结果,你可以在这个演示小提琴中看到:

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

| NOOFWEEKENDS1 |
|---------------|
|             1 |
Run Code Online (Sandbox Code Playgroud)