我正在尝试将一段数据分配一年的时间段。我可以使用两个日期字段进行子集化。首先,我应该在我的where子句中使用DATE1。如果是NULL,那么我需要使用DATE2。如果两者都是NULL,那么显然它们不符合条件。
注意:我不是SQL Server专家。我只是使用Ent。经理获得一些查询结果。我通常使用SAS编程并且对TSQL感到满意,但我不知道SQL Server 2008附带的所有技巧。
SELECT count(CASE WHEN msg_fmt = 'ABC' then 1 END) as GRP1_CNT,
count(CASE WHEN msg_fmt = 'LMN' then 1 END) as GRP2_CNT,
count(CASE WHEN msg_fmt = 'XYZ' then 1 END) as GRP3_CNT,
FROM msg_repository
WHERE (CASE WHEN DATE1 IS NOT NULL then
DATE1 between '2010-01-01' and '2011-01-01'
ELSE DATE2 between '2010-01-01' and '2011-01-01'
END)
GROUP BY msg_fmt
因此,如果DATE1不为NULL,请使用该日期。如果为NULL,请使用DATE2。我更希望有一个只使用T-SQL的解决方案,因为该解决方案也可以在SAS中使用。但是,我现在会采取任何措施。
感谢您的帮助。
答案 0 :(得分:5)
您可以使用coalesce
:
where coalesce(date1,date2) between '2010-01-01' and '2011-01-01'
答案 1 :(得分:2)
如果您只处理两个值,则ISNULL(适用于2个值)将起作用。
如果您使用日期时间数据类型,我会给出一个警告,请记住像“2011-01-01”这样的值不包括该日期的任何时间(小时/分钟/秒/纳秒)。换句话说,'2011-01-01'上午8点 大于 '2011-01-01'。
无论如何,这是一个ISNULL的例子:
ISNULL(date1, date2) between '2010-01-01' and '2011-01-01'