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

时间:2014-10-01 09:27:35

标签: mysql sql-server sql-server-2000 datediff

我正致力于将功能从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。

1 个答案:

答案 0 :(得分:7)

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

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

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

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

要查找本周的SQL Server开始,您可以使用 @@DATEFIRST 运行此操作:

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

您可以将计算更改为在几天而不是几周内工作并除以7以获得更准确的值,您可以根据需要进行舍入:

MySQL:SQL Fiddle Demo

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


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

SQL Server:SQL Fiddle Demo

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

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

您可以向上或向下舍入,具体取决于您是否希望与之前的结果相匹配或将其视为额外的周末。

SQL Server似乎计算了两个日期之间的星期日数(如果这是一周的开始),如 this example fiddle 所示,我将日期范围更改为2天,星期六和星期天:

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

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

如同this demo fiddle所示,MySQL中的相同值似乎只计算一整天的7天:

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

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

只有在完整的7天过后,您才会得到1的结果,如this demo fiddle所示:

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

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