【发布时间】:2017-10-16 15:40:56
【问题描述】:
我们为客户提供服务,每个客户都有 90 天的授权 我想创建一个将 15 天视为整月的函数。 例如,假设客户在 2017 年 10 月 17 日获得授权。这意味着 10 月不到 15 天,因此 10 月不计入授权,但必须计入 11 月、12 月和 2018 年 1 月。
;WITH CTE AS (
select
d.ClientId,
LOC
datediff(day, l.DecisionOn, d.duedate) 'Days',
l.DecisionOn,
d.duedate
from code d
join codeloc l on d.curdocversionid = l.docversionid
join codeaccess a on a.docversionid = d.curdocversionid
where codeid = 69999
and aoca in ('68','69','70','71','72','74')
),
T AS (
SELECT ClientId, LOC, COUNT(*) CNT FROM CTE
WHERE [Days] > 15
AND AuthorizedDecisionOn > DATEADD(MONTH, (CASE WHEN DAY(GETDATE()) > 15 THEN 1 ELSE 0 END) , CAST( GETDATE() as date))
AND duedate < DATEADD(MONTH,3 + (CASE WHEN DAY(GETDATE()) > 15 THEN 1 ELSE 0 END) , CAST( GETDATE() as date))
GROUP BY ClientId, LOC
)
【问题讨论】:
-
您的查询有什么问题?你能从你的表中添加一些示例数据吗?
-
他们希望能够查看在任何给定时间有多少当前客户获得授权,这些客户计入我们的目标
-
使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql缩小了选择范围,但没有指定数据库。表模式、示例数据和预期结果非常有用。 -
提示:
GetDate()在查询中的处理方式有点奇怪。每个 instance 在查询中都有一个常量值。例如select GetDate() as D1, GetDate() as D2 from SomeTable可能会为两列返回两个不同的值,但它们不会因一行而异。在多个语句中使用GetDate()时,例如在存储过程中,可以通过获取单个值并在整个过程中使用它来避免有趣的意外,即declare @Now as DateTime = GetDate();并根据需要使用@Now。
标签: sql tsql reporting-services