【问题标题】:SQL LIKE Statement on a DateTime TypeDateTime 类型的 SQL LIKE 语句
【发布时间】:2012-08-16 18:55:43
【问题描述】:

如何在 SQL Server 中对 DateTime 数据类型的列执行 LIKE 语句?

如果我运行以下 SQL,它会返回包含 2009 年的所有日期。

SELECT * FROM MyTable where CheckDate LIKE '%2009%'

但是,如果我想要所有 10 月、11 月和 12 月的日期,我希望能够执行以下操作:

SELECT * FROM MyTable where CheckDate LIKE '%2009-1%'

但这并没有给我任何回报!

我为用户提供了一个过滤选项,他们在其中键入日期字符串,并在他们键入时过滤数据。因此,如果他们输入“20”,我想返回日期内所有带有“20”的日期(所以这可能是所有 2012 年的日期或像 1999 年 6 月 20 日这样的日期值)

有人可以帮忙吗?

我使用的是 SQL Server 2008。

提前致谢。

【问题讨论】:

  • 感谢您的回复,我已经更新了工作,提供了更多关于我正在尝试做的事情的详细信息
  • 您是否检查过您的用户是否需要这样的设施?我从来不想找到“任何一个月的第 10 天、10 月或 2010 年发生的所有活动”。

标签: sql sql-server-2008 datetime


【解决方案1】:

您可以使用DATEPART 函数提取部分日期。它还应该使您的查询更明确地说明您要实现的目标:

SELECT * FROM MyTable
where DATEPART(year,CheckDate)=2009 and
      DATEPART(month,CheckDate) between 10 and 12

(也有专门命名的函数,例如MONTHYEAR,但为了保持一致性,我更喜欢DATEPART,因为它可以访问datetime 的所有组件)

您应该尽量避免将datetimes 视为具有任何类型的字符串格式。将它们视为字符串是我们遇到的最大错误来源之一。

【讨论】:

    【解决方案2】:

    如果您需要使用Like 运算符(出于某种原因),您必须将DateTime 列转换为varchar

    SELECT * 
    FROM MyTable 
    WHERE CONVERT(VARCHAR, CheckDate, 120) LIKE '%2009-1%'
    

    【讨论】:

      【解决方案3】:

      你可以这样使用:

      SELECT * 
      FROM MyTable 
      WHERE CheckDate >= '2009-10-01' AND CheckDate < '2010-01-01';
      

      【讨论】:

      • 当您使用它时 - 尝试使用 独立于语言的 日期格式 - 例如 20091001 - 适用于所有语言版本SQL Server 的 ....
      • 危险。虽然原始查询强制将 datetime 转换为字符串(因此将始终产生格式一致的值),但这会强制从字符串转换为 datetime,并且根据区域设置,实际上可能会查询任何内容2009 年 1 月 10 日或之后
      • @Damien_The_Unbeliever 根据 ISO 8601,YYYY-MM-DD 不正确吗?
      • @Magnus - 是的。这并不一定意味着 SQL Server 将此类字符串解释为 ISO 8601。当然在旧版本上,并转换为 datetime 而不是 datetime2,是否将其解释为 YYYY-MM-DD 或 YYYY-DD-MM 取决于关于区域设置。这些版本中唯一安全的明确日期文字(没有时间)是 YYYYMMDD,没有分隔符。
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2010-10-11
      • 1970-01-01
      • 2012-05-05
      • 2018-01-22
      相关资源
      最近更新 更多