Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何计算从特定日期算起的周数?_Sql_Mysql_Date Manipulation - Fatal编程技术网

MySQL:如何计算从特定日期算起的周数?

MySQL:如何计算从特定日期算起的周数?,sql,mysql,date-manipulation,Sql,Mysql,Date Manipulation,我需要计算从MySQL select语句中的日期算起的周数。其中一个表中有一个日期列,我需要计算距离该日期还有多少周 SELECT EventDate, (calculation) AS WeeksOut FROM Events; 例如: mysql> select week('2010-11-18') - week ('2010-10-18'); +------------------------------------------+ | week('2010-11-18') - we

我需要计算从MySQL select语句中的日期算起的周数。其中一个表中有一个日期列,我需要计算距离该日期还有多少周

SELECT EventDate, (calculation) AS WeeksOut FROM Events;
例如:

mysql> select week('2010-11-18') - week ('2010-10-18');
+------------------------------------------+
| week('2010-11-18') - week ('2010-10-18') |
+------------------------------------------+
|                                        4 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select datediff('2010-11-18' , '2010-10-18') / 7;
+-------------------------------------------+
| datediff('2010-11-18' , '2010-10-18') / 7 |
+-------------------------------------------+
|                                    4.4286 |
+-------------------------------------------+
1 row in set (0.00 sec)
  • 6天之后,每周=0
  • 7天之后,每周=1
  • 13天之后,每周=1
  • 14天之后,每周=2
使用:

WEEKS的问题是,对于跨越1月1日的日期,它不会返回正确的结果


0
是函数中要使用的小数位数。

这里有一个简单的方法:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events;
例如:

mysql> select week('2010-11-18') - week ('2010-10-18');
+------------------------------------------+
| week('2010-11-18') - week ('2010-10-18') |
+------------------------------------------+
|                                        4 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select datediff('2010-11-18' , '2010-10-18') / 7;
+-------------------------------------------+
| datediff('2010-11-18' , '2010-10-18') / 7 |
+-------------------------------------------+
|                                    4.4286 |
+-------------------------------------------+
1 row in set (0.00 sec)
另一个选项是以天为单位计算时间间隔并除以7:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events;
例如:

mysql> select week('2010-11-18') - week ('2010-10-18');
+------------------------------------------+
| week('2010-11-18') - week ('2010-10-18') |
+------------------------------------------+
|                                        4 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select datediff('2010-11-18' , '2010-10-18') / 7;
+-------------------------------------------+
| datediff('2010-11-18' , '2010-10-18') / 7 |
+-------------------------------------------+
|                                    4.4286 |
+-------------------------------------------+
1 row in set (0.00 sec)

为了克服整个“新年”问题,你仍然想使用,我发现下面的方法非常有效

SELECT 
    YEAR(end_date)*52+WEEK(end_date)
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out
FROM
    events;

此方法(与
DATEDIFF
方法相反)的不同之处在于它与周对齐。因此,今天(周一)和上周五将使用此方法返回
1
,但在较新版本的MYSQL中,使用
DATEDIFF
方法返回
0
,如果使用as列类型,则可以使用:

因此,在您的示例中,它将是:

SELECT TIMESTAMPDIFF(WEEK, NOW(), EventDate) AS WeeksOut FROM Events;

部分周你想做什么?例如:3.2857周应该是3周、4周还是介于两者之间?是的,应该四舍五入到my Side最接近的整周解释+1。如果日期在同一年内,您的(第一个)解决方案才有效。例如,当事件发生在一月,而现在是十二月时,它将不起作用。加上一个,但是你能添加到文档的链接以获得更好的解释吗。为什么在7之后是0?@JohnMax:添加了关于0的信息。