2016-01-04 52 views
0

我有一个包含两个日期列的表,它们都允许空值。是否有可能在SQL Server计算的列中有一个Case语句

如果FileDate不为空,则AsOfDate需要等于(FileDate - Offset),其中Offset是默认值为零的整数列。

这里是我的表DEF:

CREATE TABLE [import].[CMAR_GLXXXX](
[FileDate] [date] NULL, 
[LoadDTM] [date] NULL, 
[AsOfDate] [date] NULL, 
[AccountNumber] [varchar](50) NOT NULL, 
[CostCenter] [varchar](50) NOT NULL, 
[OffSet] [int] default (0) NOT NULL, 
[Value] [decimal](10,2) NOT NULL 
) ON [PRIMARY] 

我尝试使用以下内容:

(case when [File] IS NULL then NULL else dateadd(day,(-1 * [Offset]),[FileDate]) end) 

不幸的是,计算列错误对话框不排除故障的表达显示太大的帮助。

任何想法?

+0

你可以分享你的完整'create table'语句吗? – Mureinik

+0

会做但col的名字是不同的。我会清理问题,让它们匹配。 – bsivel

+0

'CASE'不是一个语句 - 它是一个**表达式**(比如'a + b'),它可以返回一个原子值(来自一组可能的选择)。是的 - 一个CASE表达式可用于任何可以使用任何其他表达式的地方 - 包括在计算列定义中 –

回答

6

一个案例表达式在这里是完全有效的,但不是你想要的输出所需要的。让sql server自然处理NULLS。

dateadd(day,(-1 * x),[d1]) 

- 编辑 -

为了证明这里是一个表定义。看来这正是你正在寻找的。

create table #Something 
(
    x int 
    , d1 datetime 
    , compCol as dateadd(day, (-1 * x), [d1]) 
) 

insert #Something 
select 3, null union all 
select 4, '2016-01-01' 

select * 
from #Something 
+0

谢谢SL - 现在适用于我的表:case nullate then null dateadd(dd, - 1 *抵消,提交)结束 – bsivel

+0

...并且是 - 在我的方案中没有必要使用case语句。以下工作正常:dateadd(dd,-1 * offset,filedate) – bsivel

0

我假设你的表达是正确的。大小写正确的语法。

CREATE TABLE CMAR_GLXXXX(
[FileDate] [date] NULL, 
[LoadDTM] [date] NULL, 
[AsOfDate] [date] NULL, 
[AccountNumber] [varchar](50) NOT NULL, 
[CostCenter] [varchar](50) NOT NULL, 
[OffSet] [int] default (0) NOT NULL, 
[Value] [decimal](10,2) NOT NULL 
) 

select 
(case when [FileDate] IS NULL then NULL else dateadd(day,(-1 * [OffSet]),[FileDate]) end) 
from CMAR_GLXXXX 
相关问题