ColdFusion 9 - SQL语句 - 布尔逻辑

时间:2014-10-08 20:47:15

标签: sql math coldfusion boolean-logic

我已经把它搞砸了。这将是一个简单的小数学逻辑问题。但是对于我的生活,我无法让它正常运作。

尽量避免在预订系统中预订双重内容。目前的代码......

  and schdate = #createODBCDate(schdate)#
  and ( schstart >= #createODBCTime(stime)# and 
        actend <= #createODBCTime(actend)# 
      )

基本上尝试检查 - 如果说开始时间是日期的下午2点,并在下午3点结束...... 我需要检查一下我是否正在尝试预订重叠的内容...试着在下午2:15预订... 应该用支票说 - 冲突。

所以认为这是数学逻辑的事情 - 不是ColdFusion的事情......今天只是一个空气大脑......

Thanx for lead - 我想我可能已经想到了 - 仍在测试......下面似乎有效。开发链接提供了洞察力。

     and schdate  = #createODBCDate(schdate)#
     and schstart < #createODBCTime(actend)# 
     and actend   > #createODBCTime(stime)#

1 个答案:

答案 0 :(得分:1)

<强>更新

以下原始查询的

Merle_the_Pearl's revision更直观一些。基本上反转比较:

WHERE   DateColumn = #RequestedDate#
AND     StartTimeColumn < #RequestedEndTime#
AND     EndTimeColumn > #RequestedStartTime#

我记得在这个主题上看到一个很棒的主题:Finding overlapping dates。 (ASCII插图是一个很好的接触:)。假设您的预订不会持续多天,那么它也应该可以正常运行。

通常的方法是检查每种类型的冲突:

  • 重叠:即请求9-10AM,但已经预订了9:30-11AM
  • 落入:即请求时间为上午10-11点,但现有预订时间为9-12PM
  • 包围:即请求时间为下午12点至下午5点,但现有预订时间为2-3点

该链接提到了一种更优雅的方法。从本质上讲,它将所有这些步骤减少到单个过滤器。

    WHERE FE >= SD and FS <= ED

如果找到匹配项,则表示存在冲突。翻译应该看起来像这样(未经测试)。

 SELECT  Columns
 FROM    SomeTable
 WHERE   #RequestedEndTime# >= StartTimeColumn
 AND     #RequestedStartTime# <= EndTimeColumn
 AND     DateColumn = #RequestedDate#

NB:为清楚起见,我故意省略了cfqueryparam。显然我建议在实际查询中使用它。