Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server 从自定义日期计算周数_Sql Server_Ssms - Fatal编程技术网

Sql server 从自定义日期计算周数

Sql server 从自定义日期计算周数,sql-server,ssms,Sql Server,Ssms,我有客户ID和他们的登录日期。我想计算他们第一次登录日期的周数 我对sql相当陌生 演示输出 ClientID Date of login Week Number 1 2019-12-20 1 1 2019-12-21 1 1 2019-12-21 1 1

我有客户ID和他们的登录日期。我想计算他们第一次登录日期的周数

我对sql相当陌生

演示输出

ClientID          Date of login         Week Number
1                 2019-12-20                1
1                 2019-12-21                1
1                 2019-12-21                1 
1                 2019-12-22                1 
1                 2019-12-29                2 
1                 2019-12-29                2
2                 2020-01-27                1 
2                 2020-01-28                1 
2                 2020-02-05                2
2                 2020-02-06                2
2                 2020-02-16                3 

此查询返回周数

选择DATENAMEWW,“2019-12-20”

这是针对MSSQL的

这里可能有一个解决方案给你,你可能只需要看看你将要做的插入,也许优化它一点更好

选择1作为“客户ID”,选择2019-12-20作为“登录日期”,选择1作为“周” 试验

插入测试 从测试中选择top1 1,“2020-02-05”,案例日期diffweek,“2020-02-05”,当0时登录数据,然后选择第1周else week+1结束,其中ClientID=1订单由登录数据描述


这是一个非常简单的日期算法,只需要每个ClientID的mindateoflogin,您可以通过窗口函数找到它

计算此日期和当前DateOfLogin之间的datediff(以天为单位),整数除以7不返回小数天,然后加1以正确偏移WeekNum值:

输出
请发布您的特定sql版本您使用的是哪种dbms?说到日期/时间,许多产品远远不符合ANSI SQL…这有帮助吗?如果第一次登录是在星期六,您预计第二周什么时候开始?第一次登录后7天,或下一个星期一?获取用户的MINlogin_日期,并获取特定登录日期与此最小日期之间的天数差。除以7,这将给你一个相对于用户第一次登录的周数。没有指定dbms的问题的特定于产品的答案。至少告诉我们这是针对哪个dbms的。这是因为2019-12-20不是第一周。OP希望在第一次登录时开始计算周数。这与实际的周数无关。
declare @l table(ClientID int, DateOfLogin date);
insert into @l values(1,'2019-12-20'),(1,'2019-12-21'),(1,'2019-12-21'),(1,'2019-12-22'),(1,'2019-12-29'),(1,'2019-12-29'),(2,'2020-01-27'),(2,'2020-01-28'),(2,'2020-02-05'),(2,'2020-02-06'),(2,'2020-02-16');

select ClientID
        ,DateOfLogin
        ,(datediff(day,min(DateOfLogin) over (partition by ClientID),DateOfLogin) / 7) + 1 as WeekNum
from @l;
+----------+-------------+---------+
| ClientID | DateOfLogin | WeekNum |
+----------+-------------+---------+
|        1 | 2019-12-20  |       1 |
|        1 | 2019-12-21  |       1 |
|        1 | 2019-12-21  |       1 |
|        1 | 2019-12-22  |       1 |
|        1 | 2019-12-29  |       2 |
|        1 | 2019-12-29  |       2 |
|        2 | 2020-01-27  |       1 |
|        2 | 2020-01-28  |       1 |
|        2 | 2020-02-05  |       2 |
|        2 | 2020-02-06  |       2 |
|        2 | 2020-02-16  |       3 |
+----------+-------------+---------+