【问题标题】:sql date comparisonsql日期比较
【发布时间】:2011-06-09 10:59:05
【问题描述】:

我收到了类似的查询

select * 
from stuff where stuff.id = 1 
and start_Dt < = todays_date 
and End_Dt > = todays_date 

我问给我的人为什么要进行日期比较,答案是“开始日期和结束日期对于确保唯一记录匹配是必要的”

我很困惑,这种比较不等于任何可能的日期吗?

【问题讨论】:

  • stuff.id是主键吗?
  • 不确定,不这么认为
  • 答案取决于您的数据库结构、该查询的参数以及您如何验证插入到表中的记录。没有这些数据很难回答你的问题。只要 start_Dt 低于 EndDt,它就会为您提供今天日期在其范围内的记录。
  • @StevieG:一点也不。看我的回答
  • 这个表看起来像一个训练计划表,我们可以说用户想要当前正在进行的 id 为 1 的训练(将特定训练与当前训练集区分开来)而不是未来计划的训练或者哪个更早结束

标签: sql sql-server tsql datetime date-comparison


【解决方案1】:

原因是,您的表中的 ID 不是唯一的,也就是说,stuff.id = 1 可以有不止一行。
但在任何给定时间只有一个处于活动状态。这通过日期比较进行检查:它返回当前有效的带有stuff.id = 1 的行。这是开始日期在过去 (start_Dt &lt;= todays_date) 和结束日期在未来 (End_Dt &gt;= todays_date) 的行。

【讨论】:

  • "这是过去的开始日期 ('start_Dt = todays_date)" --- 基本上是任何日期那么可能
  • 什么意思?您可以获得任何日期的当前有效条目,是的。您无需提供今天的日期。您可以提供去年的日期,您会得到当时有效的条目。
  • 这是一个很好的答案。查找“类型 2”缓慢变化的维度,通常用于数据仓库。很可能您有一个可能出现多次但在任何给定时间仅“活跃”的 ID。
  • 提供的查询旨在使用今天的日期。不确定该日期比较将如何“确保唯一的记录匹配”
  • @Ronn:请重新阅读我的回答。在任何给定时间,只有 ID = 1 的 一个 条目是有效的。这意味着,对于任何给定的 ID 和日期,您最多将获得一行。它与今天的日期无关(因为它一直在变化......)。它与指定日期根本有关。否则,您将获得所有条目,不再有效的条目、当前有效的条目和将来有效的条目。通过指定今天的日期而不是去年的日期,您只需确保您获得的唯一匹配是当前有效的那个,而不是去年某个时候有效的那个。
【解决方案2】:

为了举例说明 daniel-hilgarth 的回答,您可能有一个表格,其中包含随时间变化的费率。

此特定示例显示了英国的标准增值税税率。

id  StartEffectiveDate  EndEffectiveDate    Rate
1   01/01/1900 00:00    30/11/2008 23:59    17.5
1   01/12/2008 00:00    31/12/2009 23:59    15.0
1   01/01/2010 00:00    03/01/2011 23:59    17.5
1   04/01/2011 00:00    01/01/2099 00:00    20.0

所以对于今天的汇率,这将返回这一行

id  StartEffectiveDate  EndEffectiveDate    Rate
1   04/01/2011 00:00    01/01/2099 00:00    20.0

这个系统的优点是你可以预先实现这个表。因此,在 2009 年 12 月,它将使用 15.0 增值税,但一旦您的计算机日期达到 2010 年 1 月 1 日,它将自动更改为 17.5,然后在日期达到 2011 年 1 月 4 日时再次更改。

您还可以使用它来计划未来的价格上涨。

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2011-06-15
    • 2021-12-23
    • 2018-08-31
    相关资源
    最近更新 更多