Tsql 如何在T-SQL中识别DATETIME空记录?

Tsql 如何在T-SQL中识别DATETIME空记录?,tsql,datetime,null,Tsql,Datetime,Null,我在下面开发一个tsql查询。如何识别其中包含1900%的记录 SELECT DISTINCT TICKET, COMPLAINT_LEVEL, COMPLETION_DATE, DATE_FILTER, YEAR(DATE_FILTER) AS YEAR_FILTER, MONTH(DATE_FILTER) AS MONTH_FILTER, left(datename(month, DATE_FILTER), 3) + ' ''' + RIGHT(year(DATE_FILTER), 2) A

我在下面开发一个tsql查询。如何识别其中包含1900%的记录

SELECT DISTINCT TICKET, COMPLAINT_LEVEL, COMPLETION_DATE, DATE_FILTER, YEAR(DATE_FILTER) AS YEAR_FILTER, MONTH(DATE_FILTER) AS MONTH_FILTER,
left(datename(month, DATE_FILTER), 3) + ' ''' +
RIGHT(year(DATE_FILTER), 2) AS SHORT_DATE_FILTER,
CASE WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND COMPLETION_DATE IS NULL THEN DATE_FILTER 
 WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND
 COMPLETION_DATE IS NOT NULL AND ABS(DATEDIFF(DAY, COMPLETION_DATE, MONTH_END)) >= 1 AND DATE_FILTER < CURRENT_DATE_END THEN DATE_FILTER
 ELSE 0 END AS ROW_TYPE
FROM #TEMP
--WHERE row_type = 0
--line above does not work
这就是我的输出


似乎没有具有空值的datetime

尽管只检查行类型看起来很诱人。它将不起作用,它是一个计算列。您需要将脚本更改为此,以便检查行类型,否则需要与生成计算列的整个表达式进行比较

SELECT * FROM (
SELECT DISTINCT TICKET, COMPLAINT_LEVEL, COMPLETION_DATE, DATE_FILTER, YEAR(DATE_FILTER) AS YEAR_FILTER, MONTH(DATE_FILTER) AS MONTH_FILTER, 
left(datename(month, DATE_FILTER), 3) + ' ''' + 
RIGHT(year(DATE_FILTER), 2) AS SHORT_DATE_FILTER, 
CASE WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND COMPLETION_DATE IS NULL THEN DATE_FILTER  
 WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND 
 COMPLETION_DATE IS NOT NULL AND ABS(DATEDIFF(DAY, COMPLETION_DATE, MONTH_END)) >= 1 AND DATE_FILTER < CURRENT_DATE_END THEN DATE_FILTER 
 ELSE 0 END AS ROW_TYPE 
FROM #TEMP ) a
WHERE YEAR(ROW_TYPE) = 1900

这也会起作用:

WHERE ROW_TYPE = 0

但是,正如已经正确指出的,行类型列不能在同一SELECT的WHERE子句中引用。通常,您会添加一个外部选择,可以访问内部选择的所有别名。

它在上面的sql中不起作用。无法与计算列进行比较。即便如此,它也只适用于1900年的第一天。根据测试数据,这似乎足够了。数字与日期数据类型不兼容。但ROW_类型显然是datetime。我不明白你为什么认为这对上面的查询不起作用。这个简单的例子似乎显示了它的作用:从SELECT GETDATE UNION ALL SELECT 0xd中选择*其中d=0。查询返回一行值为1900-01-01 00:00:00.000。是的,我明白你的意思,你完全正确。我专注于比较本身。当然,在WHERE子句中无法直接访问该列,您的建议是解决这一问题的常见方法。谢谢你这么坚持!:我知道你把注意力放在了我评论的错误部分。通常我们知道自己是对的,即使我们不是:
WHERE ROW_TYPE = 0