我有一个名为ACTUALCLOSEDATE的日期时间字段,当一个名为STATUSNUM = 0的相应字段时,该字段等于9999-12-31 00:00:00。当STATUSNUM更改为1时(当记录关闭时)该值ACTUALCLOSEDATE更改为当前日期时间。
在我的查询中,我想在= 9999-12-31 00:00:00时用'仍然打开'替换ACTUALCLOSEDATE的值,当它不是我想要的时候。
我在下面尝试了错误代码。想法?我没有IIF可用的SQL 2008 r2,是吗?如果是这样我可以使用它吗?
/* This is what I need but it dosen't work in SQL 2008 R2 */
SELECT
IIF (YEAR(ACTUALCLOSEDATE)=9999, "Still Open", ACTUALCLOSEDATE) AS ActCloseDate,
FROM OPPORTUNITY
/* This dosen't work either */
SELECT
CAST YEAR(ACTUALCLOSEDATE)
WHEN 9999 THEN 'Still Open'
ELSE ACTUALCLOSEDATE
END AS Act_Close,
FROM OPPORTUNITY
答案 0 :(得分:4)
您的列必须是一致的数据类型;在您的实例中,您试图有条件地显示日期或varchar。
你可以这样做:
SELECT
CASE YEAR(ACTUALCLOSEDATE)
WHEN 9999 THEN 'Still Open'
ELSE CAST(ACTUALCLOSEDATE AS nvarchar(25))
END AS Act_Close
FROM OPPORTUNITY
您希望使用CONVERT
将ELSE
表达式中的日期格式化为首选格式。
答案 1 :(得分:2)
这是语法:
SELECT
CASE WHEN YEAR(ACTUALCLOSEDATE) = 9999
THEN 'Still Open'
ELSE CONVERT(VARCHAR, createDate, 120) --Format: yyyy-mm-dd hh:mi:ss(24h)
END AS Act_Close,
FROM OPPORTUNITY
您需要将日期列转换为varchar
,以使其与“仍然打开”的类型相同
答案 2 :(得分:1)
IIF
从SQL Server 2012开始可用。
您可以在2008 R2中使用CASE
语句。请注意,它是CASE
,而不是CAST
。