php - 获得最独特的结果,获得奇怪的..结果

标签 php mysql sql calendar unique

我对编程还很陌生,似乎无法找出我的错误。

我有一个日历设置,每次用户更改一天时,我都会创建一个新行。这样,所有更改都会被记录(同样是新的,我想有更好的方法。)每一行都有一些显示的信息,但其主要区别是一个月、一天和一年。 IE 1 31 2013 。

我需要获取该月每一天的最新唯一行。因此,如果我运行 1/31/2013 的查询,我只需要返回最近创建的行 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”),它不会返回我当前查询的那一行。我通过将时间戳修改为较晚的日期来对此进行测试,然后它正常返回。我希望这足以解释我的问题。我仍然不清楚为什么更改时间戳会导致该行返回。

感谢您的宝贵时间! -杰尔

最佳答案

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

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

  • 固定时刻:UTC 时间 2013 年 12 月 4 日上午 10:15
  • 重复发生的瞬间:每天、每周二或每月最后一个周一上午 10:15
  • 从 anchor 定义的瞬间:从现在起 2 小时
  • float 间隔:2小时
  • 固定间隔:2 小时(UTC 时间 2013 年 12 月 4 日上午 10:15 至中午 12:15)
  • 不存在的瞬间:澳大利亚东部夏令时间 2014 年 10 月 5 日星期日凌晨 2:30
  • 相隔 1 小时发生两次的瞬间:澳大利亚东部夏令时间 2014 年 4 月 6 日星期日凌晨 2:30
  • ...你就明白了。

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

关于php - 获得最独特的结果,获得奇怪的..结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388577/

相关文章:

mysql - 使用多行作为一个订单

Php mysql 连接到带有字段名称的子数组

php - 如何下载MongoDB 3.0?

mysql - 无法通过 NetBeans 插入 MySQL

mysql - 使用条件将 mysql 表连接到自身

sql - LINQ 和 Lambda 表达式等效于 SQL In

sql - 为什么 MySQL 从两个不同的查询中有效地输出数据?

PHP:连接长字符串时丢失字符

php - 使用 CI DataMapper ORM 连接不同数据库中的表

PHP序列化字符串格式