【问题标题】:How to use mixed text and date field in WHERE clause?如何在 WHERE 子句中使用混合文本和日期字段?
【发布时间】:2013-04-03 08:36:32
【问题描述】:

无论如何我可以使用视图/内联表函数来使用包含文本和日期的字段的 where 子句中的日期范围来查询表。

日期字段数据类型为nvarchar,包含dd/mm/yyyy.格式的文本和文本日期

我尝试使用 CTE/子查询,使用 ISDATE 函数来排除非日期值,使用 dmy 的 DATEFORMAT 设置。这有时有效,但大多数时候会发生此错误。

Msg 241, Level 16, State 1, Line 3
Conversion failed when converting date and/or time from character string.

我无法更改表格或系统的设计。我已经在使用多语句表函数来实现这一点,但想知道这是否可以使用内联。

这是使用 SQL Server 2008。

【问题讨论】:

    标签: sql-server sql-server-2008 date view


    【解决方案1】:

    此 Connect 项描述了您的问题:

    http://connect.microsoft.com/SQLServer/feedback/details/537419/sql-server-should-not-raise-illogical-errors

    您必须始终使用 CASE 表达式包装日期(/文本混合)列,并在将非日期从 CTE 或子查询中转移之前对其进行 NULL 化。

    【讨论】:

      【解决方案2】:

      最近我解决了一个类似的问题。如果它适合您,请尝试此解决方案 -

      DECLARE @temp TABLE (dt VARCHAR(12))
      
      INSERT INTO @temp (dt)
      VALUES 
        ('12/12/2012')
      , ('13/12/2012')
      , ('14/12/2012')
      , ('string')
      , ('14/05/2013')
      , ('test/2013')
      
      DECLARE @t TABLE (dt DATETIME)
      
      INSERT INTO @t
      SELECT dt = CONVERT(DATETIME, t.dt, 104)
      FROM @temp t
      WHERE t.dt LIKE '__/__/____' -- '[1-3][0-9]/[0-1][0-2]/____'
      
      SELECT * 
      FROM @t 
      WHERE dt BETWEEN '20121212' AND '20121213'
      

      【讨论】:

      • 虽然这可能有效,但我一直在寻找使用视图或内联表函数的解决方案。这将创建一个我已经拥有的多语句函数。谢谢。
      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2018-05-31
      相关资源
      最近更新 更多