假设我需要从数据库中选择某个时间段内的日期字段记录。查询语句如下:
SELECT * FROM [MyTable] WHERE [Date] >= @RangeBegin AND [Date] <= @RangeEnd;
但是当日期字段为空或无效时,我有一个小条件。在这种情况下,日期值应从@DefaultDate中获取。
如何将所有这些内容放入SQL中?
假设我需要从数据库中选择某个时间段内的日期字段记录。查询语句如下:
SELECT * FROM [MyTable] WHERE [Date] >= @RangeBegin AND [Date] <= @RangeEnd;
但是当日期字段为空或无效时,我有一个小条件。在这种情况下,日期值应从@DefaultDate中获取。
如何将所有这些内容放入SQL中?
由于您提到日期可能无效,我假设您将日期存储为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
我不认为日期字段可能无效。 但是,对于空值,您可以执行以下操作:
SELECT *
FROM [MyTable]
WHERE ( [Date] IS NOT NULL
AND [Date] >= @RangeBegin AND [Date] <= @RangeEnd
)
OR ( [Date] IS NULL
AND @DefaultDate >= @RangeBegin AND @DefaultDate <= @RangeEnd
)
[Date] IS NULL
扩展为([Date] IS NULL OR ISDATE([Date]) = 0)
,并将[Date] IS NOT NULL
更改为[Date] IS NOT NULL AND ISDATE([Date]) = 1
,这样可以确保您正在检查有效的日期。但是,如果您将日期存储为字符串,则做法是错误的,除非您的数据来自导入并且您正在尝试执行数据迁移。 - SephSELECT CASE WHEN ([Date] IS NULL) THEN @DefaultDate ELSE [Date] END AS [Date]
FROM [MyTable]
WHERE ([Date] >= @RangeBegin AND [Date] <= @RangeEnd) OR ([Date] IS NULL)
选择案例:当 isdate([日期]) = 0 时,则返回 @DefaultDate,否则返回[日期]。 从... 其中日期在@RangeBegin和@RangeEnd之间,或者isdate([日期])=0
尽可能避免在 where 子句中使用 Case 语句。
[Date]
的类型是什么?DateTime还是String?参数@DefaultDate
是用于过滤数据,还是作为输出所需的数据? - Cyril Gandon