带有“错误”日期条件的Sql Server SELECT语句

3

假设我需要从数据库中选择某个时间段内的日期字段记录。查询语句如下:

SELECT * FROM [MyTable] WHERE [Date] >= @RangeBegin AND [Date] <= @RangeEnd;

但是当日期字段为空或无效时,我有一个小条件。在这种情况下,日期值应从@DefaultDate中获取。

如何将所有这些内容放入SQL中?


你需要定义无效。@RangeBegin 和 Date 是什么数据类型?空值意味着 NULL 吗? - gbn
字段[Date]的类型是什么?DateTime还是String?参数@DefaultDate是用于过滤数据,还是作为输出所需的数据? - Cyril Gandon
4个回答

5

由于您提到日期可能无效,我假设您将日期存储为varchar类型。您可以使用isdate函数来检查日期是否有效。

select case isdate([Date]) 
         when 1 then cast([Date] as datetime)
         else @DefaultDate 
       end as [Date]
from MyTable
where case isdate([Date]) 
        when 1 then cast([Date] as datetime)
        else @DefaultDate 
      end between @RangeBegin and @RangeEnd

2

我不认为日期字段可能无效。 但是,对于空值,您可以执行以下操作:

SELECT * 
FROM [MyTable] 
WHERE (     [Date] IS NOT NULL 
        AND [Date] >= @RangeBegin AND [Date] <= @RangeEnd
      )
OR    (     [Date] IS NULL 
        AND @DefaultDate >= @RangeBegin AND @DefaultDate <= @RangeEnd
      )

“日期字段”可能由于某种原因存储为varchar,如果是这种情况,我会将[Date] IS NULL扩展为([Date] IS NULL OR ISDATE([Date]) = 0),并将[Date] IS NOT NULL更改为[Date] IS NOT NULL AND ISDATE([Date]) = 1,这样可以确保您正在检查有效的日期。但是,如果您将日期存储为字符串,则做法是错误的,除非您的数据来自导入并且您正在尝试执行数据迁移。 - Seph
“SELECT *” 将从“[Date]”字段中获取任何条件的值。您必须使用“CASE”子句才能返回“@DefaultDate”。附注:问题不清楚“@DefaultDate”应该在条件还是结果中使用。 - Optillect Team

2
SELECT CASE WHEN ([Date] IS NULL) THEN @DefaultDate ELSE [Date] END AS [Date]
FROM [MyTable]
WHERE ([Date] >= @RangeBegin AND [Date] <= @RangeEnd) OR ([Date] IS NULL)

0

选择案例:当 isdate([日期]) = 0 时,则返回 @DefaultDate,否则返回[日期]。 从... 其中日期在@RangeBegin和@RangeEnd之间,或者isdate([日期])=0

尽可能避免在 where 子句中使用 Case 语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接