【问题标题】:mySQL compare two dates from Year and WeekmySQL比较年和周的两个日期
【发布时间】:2021-03-15 08:14:28
【问题描述】:

我正在尝试比较两个日期以过滤我的选择。

我在 db 中得到了这个日期:2020-W20

现在我想过滤掉比今天(2020-49 年)更早的日期

所以我试图从 db 中的日期中删除“-W”。

并从今天的日期中删除了“-”。

我最终得到了 (d2)202020 和 ($this_y_w)202049。

我的选择中没有:

SELECT CONCAT(SUBSTR(delivery_year_week,1,4), SUBSTR(delivery_year_week,7,2)) as d2 
  FROM table 
 WHERE d2 >= '$this_y_w' 
 ORDER 
    BY delivery_year_week ASC

但这不起作用。

那么我应该如何构建查询以选择大于或等于“$this_y_w”(2020-49 或 202049)的“delivery_year_week”(2020-W20 或 202020)?

【问题讨论】:

  • 不是你“选择大于或等于“$this_y_w”(2020-49 或 202049)的“delivery_year_week”(2020-W20 或 202020)'永远不会是真的
  • @P.Salmon of corse 不是。但是“delivery_year_week”的日期大于 2020-49。这只是一个示例日期。 (2020-20)。我如何通过复制 concat 部分来解决它.. 并在 WHERE 子句中用 d2 替换它
  • @P.Salmon 我已经做过了。

标签: mysql sql string datetime where-clause


【解决方案1】:

我已经通过将 CONCAT 部分复制到 WHERE 子句中的 d2 来解决它。

$query = "SELECT obj_house_floor, CONCAT(SUBSTR(delivery_year_week,1,4), SUBSTR(delivery_year_week,7,2)) as d2 FROM object_house_floor WHERE CONCAT(SUBSTR(delivery_year_week,1,4), SUBSTR(delivery_year_week,7,2)) >= '$this_y_w' ORDER BY delivery_year_week ASC";

【讨论】:

    【解决方案2】:

    您只需使用REPLACE(delivery_year_week,'-W','') 即可更轻松地删除-W

    您不能在 where 条件中引用像 d2 这样的选择字段别名;选择字段仅在行被 WHERE 子句过滤后计算。

    可以在 HAVING 子句中使用它们(稍后在该过程中应用),但在这种情况下,这将比在 WHERE 子句中重复 d2 的表达式效率低。

    【讨论】:

      【解决方案3】:

      我建议将输入字符串转换为与存储值一致的格式,而不是相反:

      where delivery_year_week >= concat(left(:this_y_w, 4), '-W', right(:this_y_w, 2))
      

      直接对存储的值进行过滤效率更高:它可以利用列上的索引,而另一种方法则不能,并且需要在过滤发生之前转换整个列。有人说直接过滤是一个 SARGable 谓词。

      请注意,我更改了代码,因此它使用了正确的查询参数 (:this_y_w),而不是连接查询字符串中的变量。

      最后:如果您的目的是针对当前周进行过滤,则无需使用参数。直接在数据库中进行计算更简单:

      where delivery_year_week > date_format(current_date, '%Y-W%v')
      

      【讨论】:

        猜你喜欢
        • 2017-07-15
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多