1

我有一个名为 ACTUALCLOSEDATE 的日期时间字段,当相应的字段名为 STATUSNUM = 0 时,该字段等于 9999-12-31 00:00:00。当 STATUSNUM 更改为 1(记录关闭时)时,ACTUALCLOSEDATE 的值为更改为当前日期时间。

在我的查询中,我想用 'Still Open' 替换 ACTUALCLOSEDATE 当它 = 9999-12-31 00:00:00 时的值,而我只想要日期。

我在下面尝试了错误的代码。想法?我不知道 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
4

3 回答 3

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为首选格式。

于 2012-08-30T17:43:25.830 回答
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

您需要将日期列转换为 avarchar以便它与“仍然打开”的类型相同

于 2012-08-30T17:43:55.573 回答
1

IIF从 SQL Server 2012 开始可用。

您可以CASE在 2008 R2 中使用该语句。请注意,它是CASE,不是CAST

于 2012-08-30T17:42:21.957 回答