获得数周的差异,数据存储为SQL中的YYYYMM

问题描述 投票:2回答:2

我有customer_since存储为YYYYWW,即201852。

下面的脚本是我一直用来解决差异的问题,但是当我遇到201901 - 201852的这种情况时,它会给出48而不是1.是否有mod函数或者可以合并到这里以解决问题的东西?

CAST(CONCAT (DATEPART(YEAR, DATEADD(MONTH, + 9, GETDATE()))
, RIGHT('0' + RTRIM(DATEPART(WEEK, DATEADD(MONTH, - 3, GETDATE()))+1),2)
) AS INT) - a.customer_since AS Customer_since
sql-server tsql datediff
2个回答
2
投票

您可以使用以下模板获取给定年份和周的第一个(或最后一个)日期。然后使用有效的日期时间,只需使用DATEDIFF,因为它具有内置功能,可以在几周内获得差异:

DECLARE @WeekNo int= 52
DECLARE @Year int=2018

SELECT DATEADD(wk,@WeekNo-1,DATEADD(yy,@Year-1900,0)) AS WeekStart,
       DATEADD(wk,@WeekNo,DATEADD(yy,@Year-1900,0))-1 AS WeekEnd

GO

DECLARE @WeekNo int= 1
DECLARE @Year int=2019


SELECT DATEADD(wk,@WeekNo-1,DATEADD(yy,@Year-1900,0)) AS WeekStart,
       DATEADD(wk,@WeekNo,DATEADD(yy,@Year-1900,0))-1 AS WeekEnd

GO

SELECT DATEDIFF(WEEK, '2018-12-24 00:00:00.000', '2019-01-01 00:00:00.000')

在一份声明中:

DECLARE @Input01 VARCHAR(6) = '201852' 
       ,@Input02 VARCHAR(6) = '201901'

SELECT DATEDIFF(WEEK, DATEADD(WEEK, RIGHT(@Input01, 2)-1,DATEADD(YEAR,LEFT(@Input01, 4)-1900,0)), DATEADD(WEEK,RIGHT(@Input02, 2)-1,DATEADD(YEAR,LEFT(@Input02, 4)-1900,0)));

0
投票

您可以创建一个接受日期字符串('201852')的函数,并返回一个日期,如`Create Function Todate(@dt varchar(100))返回Date Begin Declare @wk int =(选择右(@ dt,2) ))

return(选择Dateadd(WK,@ wk,cast(LEFT(@ dt,4)作为日期)))结束

现在,您只需要在函数中传递日期字符串,然后找到包含开始日期和结束日期的DATEDIFF

© www.soinside.com 2019 - 2024. All rights reserved.