sql-server - 获取以周为单位的差异,数据在 TSQL 中存储为 YYYYWW

标签 sql-server t-sql datediff

我将 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

最佳答案

您可以使用以下模板来获取给定年份和星期的第一个(或最后一个)日期。然后拥有有效的日期时间,只需使用 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)));

关于sql-server - 获取以周为单位的差异,数据在 TSQL 中存储为 YYYYWW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55485736/

相关文章:

sql - Microsoft SQL Server Management Studio,是否可以看到设计 View 背后的代码?

mysql - ALTER TABLE 语句与 FOREIGN KEY 约束 sql 冲突

sql - 我想找到 'N/A' 值并用下一个值更新它

sql-server - 在仅附加表中设置版本列

ssis - 使用 DOB 列计算年龄

sql-server - 如何在长结果查询中处理try_cast错误

sql-server - 无论 ORDER BY 如何,SELECT TOP 都很慢

sql - 使用变量作为列名

tsql - 如何在 T-SQL 中用年、月、日计算年龄

mysql - 如何从数据库中的日期中减去日期