当SQL查询等于9999-12-31 00:00:00时,需要替换SQL查询中的datetime字段

时间:2012-08-30 17:39:37

标签: sql sql-server tsql datetime case-when

我有一个名为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

3 个答案:

答案 0 :(得分:4)

您的列必须是一致的数据类型;在您的实例中,您试图有条件地显示日期或varchar。

你可以这样做:

SELECT 
    CASE YEAR(ACTUALCLOSEDATE)     
    WHEN 9999 THEN 'Still Open'     
    ELSE CAST(ACTUALCLOSEDATE AS nvarchar(25))
    END AS Act_Close
FROM OPPORTUNITY 

您希望使用CONVERTELSE表达式中的日期格式化为首选格式。

答案 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