【问题标题】:SQL like clause for datesSQL like 日期子句
【发布时间】:2011-07-28 05:18:30
【问题描述】:

我正在查询数据库以获取某年某月的所有博客文章。日期在数据库中存储为 YYYY-MM-DD

仅获取特定日期和年份的帖子的最佳万无一失的方法是什么?我尝试过链接 like 子句,但我开始意识到它们会失败的几种方式,例如,如果我使用以下语句:

'SELECT * FROM entries WHERE date LIKE \''.$year.'%\' AND date LIKE \'%'.$month_no.'%\''

如果月份数字恰好包含在年份数字的最后 3 位数字中,这将失败。我是否必须使用正则表达式,如果是,有人可以建议我可以使用的语句吗?

【问题讨论】:

  • 在询问 SQL 或数据库问题时,请告诉我们您正在使用哪个数据库。它让我们这些回答问题的人生活更轻松。

标签: sql date select


【解决方案1】:

我建议使用日期时间创建另一列(或者如果可能的话只创建日期)。以后会容易得多。

或者,您可以将其转换为日期类型并进行查询。

【讨论】:

    【解决方案2】:

    我认为以下应该可以解决这个问题:

    'SELECT * FROM entries WHERE date LIKE \''.$year.'-'.$month_no.'-%\''
    

    但是,您需要确保$year 的长度为四位数,而$month_no 的长度为两位数,使用您创建查询时使用的任何脚本语言等。

    【讨论】:

    • 谢谢,我试过了,还是不行,我想一定是因为字段是日期类型,如下m.genova所说
    【解决方案3】:

    如果 DATE 字段是 DATE TYPE 则 'like' 运算符不起作用,您必须将日期类型转换为 varchar 类型,然后您可以在转换结果上使用 'like' 运算符。

    再见

    【讨论】:

      【解决方案4】:

      我在创建一个监控事件数据库时遇到了这个问题(我的情况很复杂,因为我正在做的事情实际上是从早上 8 点开始的,所以 01/02/2011 07:59 :59" 实际上算作 1 月 1 日!,你可以做很多事情

      你过了某一天。您没有提到您从哪种语言调用 SQL ......

      1. 将日期存储为日期 inc 次,然后使用 convert 将其转换为日期,您可以正常查询(请参阅 convert 以了解转换)

      2. 按上述日期存储,并在其间使用,因此 $date1=01/01/2011 00:00:00 和 $date2=02/01/2011 00:00:00 将是

        'select * from entries where date between "'.$date1.'" and "'.$date2.'"'
        
      3. 坚持你所拥有的和做的

        'select * from entries where date = "'.$year.'/'.$month.'/'.$day.'"'
        

      但至少有了完整的日期和时间,您仍然可以按时间顺序订购它们。

      【讨论】:

        【解决方案5】:

        您的数据在数据库中存储为字符串而不是日期对象?尽可能使用to_dateCAST 从字符串创建日期对象。有很多日期时间函数使日期对象变得微不足道,例如T-SQL 和 PL-SQL 中的 DATEPART 或 MySql 中的 YEARMONTH

        【讨论】:

          【解决方案6】:

          您没有说您使用的是哪种类型的数据库。大多数产品都支持 DATE 数据类型,这将是该列的明显选择。

          但假设您实际上使用的是字符列,那么您可以通过使用substring()substr() 函数在不使用正则表达式的情况下轻松解决它:

          'SELECT * FROM entries 
          WHERE substr(date, 1, 7) =  '.$year.'-'.$month_no
          

          NB 抱歉,我不认识你的 SQL 方言,所以我可能弄错了确切的语法。

          【讨论】:

            【解决方案7】:

            请.. 使用日期过滤器。这将有助于提高性能(使用索引)

            $query = "SELECT *
            FROM entries
            WHERE date >= '" . $year . "-" . $month_no . "-01'
              AND date <  adddate('" . $year . "-" . $month_no . "-01', interval 1 month)";
            

            那是为 MySQL 准备的。对于 SQL Server,使用类似的东西,但使用 DATEADD 代替

            ...
            WHERE date >= '$year" . $month . "01'
              AND date <  DATEADD(month,1,'$year" . $month . "01'";
            

            加1个月的原因是月份为12(12月)的情况更容易处理。

            【讨论】:

              【解决方案8】:

              万无一失的可能是将您的字符串转换为日期:

              DECLARE @dateToFind datetime
              
              SET @dateToFind = CONVERT(datetime, N'2011-04-02', 20)
              
              SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) = @dateToFind
              

              或者,如果您需要一个范围:

              DECLARE @startDate datetime, @endDate datetime
              
              SELECT 
                  @startDate = CONVERT(datetime, N'2011-04-01', 20), 
                  @endDate = CONVERT(datetime, N'2011-04-30', 20) 
              
              SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) BETWEEN @startDate AND @endDate
              

              或者你可以转换两次:

              SELECT * FROM [table] WHERE YEAR(CONVERT(datetime, [datefield], 20)) = 2011 AND MONTH(CONVERT(datetime, [datefield], 20)) = 4
              

              CONVERT 中的数字 20 与您的日期格式匹配。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-23
                • 2017-08-30
                • 2019-07-15
                • 1970-01-01
                • 1970-01-01
                • 2021-12-19
                • 2012-01-07
                相关资源
                最近更新 更多