我正致力于将功能从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。
答案 0 :(得分:7)
我认为这可能是由两件事之一引起的:
您的指定日期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 |