Sql server 从两个日期中的最后一个日期派生的计算列为一个或两个日期的表可能为空
是否可以创建一个计算列来处理另外两个列(如果其中一个列可能为空) 我想在SQLServer2008R2中设置一个表,使其具有基于两个日期列的计算列。我已经能够创建一个基本的计算列,但无法基于两个列创建它。基础日期列可以为空。注意:null的结果是可以接受的(当两个日期都为null时),但如果一个日期有效,则应使用该日期计算自上次登录以来的天数 这是我到目前为止所拥有的,计算的Sql server 从两个日期中的最后一个日期派生的计算列为一个或两个日期的表可能为空,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,是否可以创建一个计算列来处理另外两个列(如果其中一个列可能为空) 我想在SQLServer2008R2中设置一个表,使其具有基于两个日期列的计算列。我已经能够创建一个基本的计算列,但无法基于两个列创建它。基础日期列可以为空。注意:null的结果是可以接受的(当两个日期都为null时),但如果一个日期有效,则应使用该日期计算自上次登录以来的天数 这是我到目前为止所拥有的,计算的LastLoginCount目前适用于一个日期列SHR\u LastLogin,但我需要它对两个日期列(SHR\u Las
LastLoginCount
目前适用于一个日期列SHR\u LastLogin
,但我需要它对两个日期列(SHR\u LastLogin
,AdLastLogin
)执行“Min”,并以天数返回最新登录
CREATE TABLE [web].[UserNotifications](
[NotificationId] [int] IDENTITY(1,1) NOT NULL,
[AdDomain] [varchar](15) NULL,
[AdAccount] [varchar](30) NULL,
[AdFull] AS (([AdDomain]+'\')+[AdAccount]),
[AdLastLogin] [date] NULL,
[SHR_LastLogin] [date] NULL,
[ManagerNotifiedOn] [date] NULL,
[NotifyManager] [bit] NOT NULL,
[LastLoginCount] AS (datediff(day,[SHR_LastLogin],getdate())),
CONSTRAINT [PK_UserNotifications] PRIMARY KEY CLUSTERED
(
[NotificationId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
您将无法在computed列中执行聚合,但是您可以使用一个有点难看的case语句来设置它(正如我第一次想到的,可能有一种更聪明的方法)。以此为例,;在
CREATE
语句中,它可以归结为以下几点:
[LastLoginCount] AS ( DATEDIFF( DAY, CASE
WHEN AdLastLogin > SHR_LastLogin
THEN AdLastLogin
ELSE SHR_LastLogin
END, GETDATE() ) ),
我明白了,你指的是登录后的MIN
天数;上面的代码已经过编辑,可以将LessThan运算符替换为GreaterThan运算符,但SQL FIDLE将继续显示前者
编辑:我最初没有理解/理解NULL
要求,非常抱歉。它只需要在评估中稍作调整,如中所示
实际上,逻辑是“如果
SHR\u LastLogin
为NULL
或AdLastLogin
大于(或等于),则使用AdLastLogin
;否则,使用SHR\u LastLogin
[在DATEDIFF
计算中]”我看到了<问题并交换了。如果两个日期都不为null,则代码可以工作,但如果一个日期为null,则结果也为null。计算列需要选择空值并返回非空值列计算天数。我将更新我的帖子以使空值问题更清楚。@OmegaMan对此表示抱歉,添加了一个调整!工作起来很有魅力!感谢您抽出时间用您的示例来澄清这一点。
[LastLoginCount] AS ( DATEDIFF( DAY, CASE
WHEN AdLastLogin >= ISNULL( SHR_LastLogin, AdLastLogin )
THEN AdLastLogin
ELSE SHR_LastLogin
END, GETDATE() ) ),