【问题标题】:Sql Server SELECT statement with a "bad" date condition具有“错误”日期条件的 Sql Server SELECT 语句
【发布时间】:2011-10-04 07:46:50
【问题描述】:

假设我需要从数据库中选择日期字段在特定时间范围内的记录。选择查询是这样的:

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

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

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

【问题讨论】:

  • 您必须定义无效。 @RangeBegin 和 Date 是什么数据类型?而空意味着NULL?
  • 字段[Date]的类型是什么?日期时间或字符串?参数@DefaultDate是用来过滤数据的,或者这就是你需要输出的数据?

标签: sql sql-server date select


【解决方案1】:

我看不出日期字段是如何无效的。 但是,对于 null 值,您可以执行以下操作:

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确保您检查有效日期的方式。但是,如果您将日期存储为字符串,那么您做错了,除非您的数据来自导入并且您正在尝试执行数据迁移。
  • SELECT * 将从[Date] 字段中获取值,无论条件如何。您必须使用CASE 子句才能返回@DefaultDate。附言问题不清楚应该在哪里使用@DefaultDate:在条件中还是在结果中。
【解决方案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)

【讨论】:

    【解决方案3】:

    既然您说日期可能无效,我假设您已将日期存储为 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
    

    【讨论】:

      【解决方案4】:

      当 isdate([Date]) = 0 时选择 case 然后 @DefaultDate else [Date] end 从 ... @RangeBegin 和 @RangeEnd 之间的日期或 isdate([Date]) = 0

      应尽可能避免 where 子句中的 case 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多