获得最独特的结果,得到奇怪的结果

时间:2013-12-04 23:48:39

标签: php mysql sql calendar unique

我对编程很陌生,似乎无法弄清楚我的错误。

我有一个日历设置,每当用户更改一天我创建一个新行时。这样就记录了所有的变化(再次是新的,id想象有更好的方法。)每一行都有一些显示的信息,但它的主要区别是每天一个月和一年。 IE 1 31 2013。

我需要获取每月每天最新的唯一行。因此,如果我运行2013年1月31日的查询,我只需要返回最近创建的行WHERE month ='1'AND等。

我正在使用..

SELECT t.* FROM(SELECT * FROM calendar a 
WHERE NOT EXISTS(SELECT * FROM calendar b 
WHERE b.day = a.day AND b.lastaltered > a.lastaltered))  t 
WHERE t.month = '12' AND t.year = '2013'

从PHP开始,如果重要的话。

现在,如果用户进行缓慢更改,它可以正常工作。但是我发现如果某人快速使用它就像输入多天而最终有一个非常接近的时间戳(“lastaltered”)它不会返回我当前查询的那一行。我通过将时间戳修改为更晚的日期来测试它,然后它正常返回。我希望这足以解释我的问题。我还不清楚为什么改变时间戳导致行返回。

感谢您的时间! - 杰尔

1 个答案:

答案 0 :(得分:0)

啊......在一个不了解时间的数据库中管理时间(而且他们都不知道)。

转到here,阅读第一本书 - 它解释了时间的复杂性和使用一种数据类型(DateTime)来表示不同概念的困难:

  • 固定时刻:2013年12月4日上午10:15 UTC
  • 反复出现的时刻:每天上午10:15,每个星期二或一个月的最后一个星期一
  • 从锚点定义的瞬间:从现在起2小时
  • 浮动间隔:2小时
  • 锚定间隔:2013年12月4日上午10:15至下午12:15 2小时UTC
  • 不存在的瞬间:2014年10月5日星期日上午2:30澳大利亚东部夏令时
  • 相隔1小时两次的瞬间:2014年4月6日星期日上午2:30澳大利亚东部夏令时
  • ......你明白了。

处理问题最简洁的方法是使用ValidFrom和ValidTo DateTime字段,当用户创建ValidFrom设置为现在的行并且ValidTo设置为NULL并执行一个触发器来设置所有旧条目一个NULL有效到现在为止。这将提供完整的审计跟踪,您可以通过查询具有NULL ValidTo的那个来获取当前条目。