【问题标题】:LIKE operator for DATE type variable in T-SQLT-SQL 中 DATE 类型变量的 LIKE 运算符
【发布时间】:2019-07-16 04:23:48
【问题描述】:

我想运行这样的条件:

SELECT COUNT(*) FROM table WHERE date_time LIKE '2019-02-02';

我尝试将其转换为 T-SQL,如下所示:

SELECT COUNT(*) FROM table WHERE date_time LIKE [dynamicDateVariable];

这会导致该日期中有多少行?

现在我试着把它放在一个 IF 语句中,像这样:

IF (SELECT COUNT(*) FROM funnel_logs 
    WHERE date_time LIKE converted_date) = '1' THEN
    //... run code
ELSE
    //... run this code
END IF;

我的目标是只获得一 (1) 行计数来运行代码,但问题是即使我在该日期有一 (1) 行计数它仍然继续执行 ELSE 语句并运行 运行此代码

注意:我使用 xampp 和 phpmyadmin 来运行它,并且我在触发器上运行这个进程。我试过使用CONVERT(VARCHAR, [dynamicDateVariable], 126) LIKE [dynamicDateVariable],但还是不行。还有一个DATEPART(),但有人说这不是很重要,我认为有一个[dynamicDateVariable] 会有太多的工作需要处理。

我错过了什么吗?我是 T-SQL 新手,如果有人能提供帮助,将不胜感激。

【问题讨论】:

  • MySql、T-SQL、phpmyadmin……你用什么? Microsoft SQL Server 还是 MySql?
  • 如果您使用的是 MySql,那么您就不是在使用 T-SQL。 MySql的sql方言叫做MySql。 T-SQL 方言仅用于 Microsoft 的 SQL Server 和 Sybase。我不了解 MySql,但在 T-SQL 中 LIKE 仅适用于字符串数据类型(char/nchar/varchar/nvarchar)。
  • 不要在约会时使用LIKE。不应在 date/datetime 值上使用字符串运算符。

标签: mysql sql tsql


【解决方案1】:

原因是您不能以这种方式使用DateTime 执行LIKE 运算符,为此您必须考虑解决方法。

  • 将您的 converted_date 日期拆分为年、月和日(您的日期 想用LIKE 执行)
  • 使用DatePart函数获取单独的年月日然后 执行比较。

以下是我自己在SqlServer上测试的代码:

declare @var int 
set @var = (SELECT 
                  COUNT(*) FROM t  
            WHERE --ddate LIKE '2019-02-22%')
                 (DATEPART(yy, ddate) = 2019) AND
                  DATEPART(mm, ddate) = 02 AND
                  DATEPART(dd, ddate) = 22)
IF (@var = 1) 
begin
    select 1
end
ELSE
begin
    select 2
END 

【讨论】:

    【解决方案2】:

    在 T-SQL 中,LIKE 运算符仅适用于字符串数据类型。

    来自official documentation

    确定特定字符串是否与指定模式匹配。

    后来:

    参数
    match_expression
    character 数据类型的任何有效表达式。

    搜索datetime/datetime2 列具有特定日期(无时间)的记录的最佳做法是使用>= 表示请求的日期,并使用<= 表示之后的一天:

    DECLARE @SearchDate Date = '2019-02-22';
    
    SELECT Columns
    FROM Table
    WHERE DateTimeColumn >= @SearchDate
    AND DateTimeColumn <= DATEADD(DAY, 1, @SearchDate)
    

    您可以以相同的方式搜索不同的范围 - 例如 - 如果您想搜索特定月份,请将日期设置为该月的第一天,而不是添加一天,而是添加一个月:

    DECLARE @SearchDate Date = '2019-02-01';
    
    SELECT Columns
    FROM Table
    WHERE DateTimeColumn >= @SearchDate
    AND DateTimeColumn <= DATEADD(MONTH, 1, @SearchDate)
    

    【讨论】:

      【解决方案3】:

      您的 SQL 脚本不工作,因为您将整数与字符串进行比较。 即 1 = '1' 将 '1' 更改为 1,如下所示,它应该可以工作:

      IF (SELECT COUNT(*) FROM funnel_logs WHERE date_time LIKE convert_date) = 1 THEN //... 运行代码 别的 //... 运行这段代码 如果结束;

      【讨论】:

      • 在这种情况下,SQL Server 将尝试将字符串隐式转换为整数。在这种情况下,它会成功。
      【解决方案4】:

      您可以对字符数据类型使用 LIKE,但不能对日期时间使用。日期时间的工作方式不同。您是否尝试过使用变量,然后使用 >= 和

      DECLARE @Date1 date=‘2019-02-02;
      DECLARE @Date2 date=DATEADD(day,1, @date1); 
      
      SELECT COUNT(*) 
      FROM table 
      WHERE date_time >= @Date1 
        AND date_time < @Date2;
      

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2015-11-30
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        相关资源
        最近更新 更多