【问题标题】:how to select date range by specified year-month in sql如何在sql中按指定的年月选择日期范围
【发布时间】:2019-12-30 07:18:56
【问题描述】:

我在 mysql 服务器数据库中有一个名为 mytbl 的表。有一个日期列 prod_date,其中包含 2019 年的所有日期,格式为 2019-xx-xx

我需要从Jan 2019 to May 2019 中提取所有行。我的以下代码没有返回任何内容。

SELECT * 
FROM mytbl
WHERE prod_date BETWEEN CONCAT('2019', '-', '01') AND CONCAT('2019', '-', '05')

谁能告诉我我做错了什么?如何仅按年和月选择日期?

提前非常感谢。

【问题讨论】:

  • 我认为这个解决方案会对你有所帮助。看看:stackoverflow.com/questions/7304504/…
  • 您的专栏是 date 还是某种类型的 datetime?这个问题的答案在这里很重要。

标签: sql sql-server


【解决方案1】:

这应该只是给你结果。

SELECT * from mytbl WHERE Year(prod_date) = 2019 and Month(prod_date) BETWEEN 1 and 5

【讨论】:

  • 这可行,但会扼杀使用包含prod_date 列的索引的任何机会。
【解决方案2】:

您不需要使用concat() 只需这样做:

where prod_date >= '2019-01-01' and prod_date <= '2019-05-31'

这假定 prod_date 具有 YYYY-MM-DD 格式。

【讨论】:

    【解决方案3】:

    您可以选择两个日期之间的行,例如您的日期格式为“YYYY-MM-DD”。如果您有其他格式,您可以更改格式和查询。

    SELECT `mytbl`.* FROM `mytbl` where `prod_date` BETWEEN '2019-01-01' AND '2019-05-31'
    

    【讨论】:

      【解决方案4】:

      只需使用不等式:

      SELECT * 
      FROM mytbl
      WHERE prod_date >= '2019-01-01' AND prod_date < '2019-06-01';
      

      作为一个小解释,正确的条件限制为严格小于 2019 年 6 月 1 日午夜的日期,其中包括同年 5 月的整个时间。请注意,编写 WHERE 子句 this 是 sargable,这意味着使用 prod_date 的索引可能是可用的。

      【讨论】:

      • @Ishan 不,不容易,你不能。您不能,因为没有时间组件的日期默认表示当天的午夜。您评论的支持者也不理解这一点。
      【解决方案5】:

      不是一个好的解决方案,而是对您的查询进行修改。

      SELECT * FROM mytbl WHERE prod_date BETWEEN CONCAT('2019','-','01','-','01') AND CONCAT('2019','-','06','-','01')
      

      【讨论】:

      • 除了不可搜索并且还使用了几个昂贵(且不必要的)连接操作之外,您的逻辑是错误的,因为它包括 6 月 1 日的午夜。觉得没关系?如果您打算为会计师事务所工作,请不要编写这样的代码。
      【解决方案6】:

      假设您使用的是 SQL SERVER,您可以使用: SELECT * FROM mytbl WHERE datepart(year,prod_date)='2019' and datepart(month,prod_date) in (01,02,03,04,05)

      【讨论】:

        猜你喜欢
        • 2018-12-24
        • 2021-10-27
        • 1970-01-01
        • 2018-06-02
        • 2012-12-14
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多