根据到期时间获取行

2024-01-07

http://sqlfiddle.com/#!9/406cb/2 http://sqlfiddle.com/#!9/406cb/2

我有一本分类为 1、2、3、4 的表格书。

  • 第 1 类 - 将停留 1 小时
  • 第 2 类 - 将停留 2 小时
  • 第 3 类 - 将停留 4 小时
  • 第 4 类 - 将停留 6 小时

如何编写查询以获得所需的结果?

E.g.:

  1. 如果当前时间是 1454411248 那么它应该显示所有书籍
  2. 如果当前时间是 1454414847 那么它不应该显示 unixtime=1454411248 的类别 1 书籍(一小时后过期)
  3. 如果当前时间是 1454418448,则到期时间 1、2、4、6 小时以下的类别 - 1、2、3、4 不应显示(unix_time将是动态的。例如,我使用了静态值)。

so on..

Table:

CREATE TABLE `books` (
    `id` int(255) NOT NULL AUTO_INCREMENT,
    `name` longtext NOT NULL,
    `category` varchar(255) NOT NULL,
    `unix_time` bigint(20) NOT NULL,
    `time_data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;


INSERT INTO `books` (`id`, `name`, `category`, `unix_time`, `time_data`) VALUES
    (1, 'book1', '1', 1454411248, '2016-02-02 05:37:28'),
    (2, 'book2', '2', 1454411248, '2016-02-02 05:37:28'),
    (3, 'book3', '3', 1454411248, '2016-02-02 05:37:28'),
    (4, 'book4', '4', 1454411248, '2016-02-02 05:37:28'),
    (5, 'book5', '1', 1454411248, '2016-02-02 05:37:28'),
    (6, 'book6', '2', 1454411248, '2016-02-02 05:37:28'),
    (7, 'book7', '3', 1454411248, '2016-02-02 05:37:28'),
    (8, 'book8', '4', 1454411248, '2016-02-02 05:37:28'),
    (9, 'book9', '1', 1454497648, '2016-02-03 05:37:28'),
    (10, 'book10', '2', 1454497648, '2016-02-03 05:37:28'),
    (11, 'book11', '1', 1454497648, '2016-02-03 05:37:28'),
    (12, 'book12', '2', 1454497648, '2016-02-03 05:37:28'),
    (13, 'book13', '3', 1454497648, '2016-02-03 05:37:28'),
    (14, 'book14', '4', 1454497648, '2016-02-03 05:37:28'),
    (15, 'book15', '1', 1454497648, '2016-02-03 05:37:28'),
    (16, 'book16', '2', 1454497648, '2016-02-03 05:37:28'),
    (17, 'book17', '3', 1454497648, '2016-02-03 05:37:28'),
    (18, 'book18', '4', 1454497648, '2016-02-03 05:37:28');

Query:

SELECT *,
    CASE category
        WHEN '1' THEN '1454407648'
        WHEN '2' THEN '1454404048'
        WHEN '3' THEN '1454396848'
        WHEN '4' THEN '1454389648'
    END as category
from books
where unix_time >1454411248

首先,您需要一个表格来关联您的category对你的价值观duration价值观。您可以创建一个物理表,也可以使用这样的子查询来生成虚拟表。

   select 1 as category, 1 as duration UNION ALL
   select 2,2 UNION ALL select 3,4 UNION ALL select 4,6

这会产生以下小查找表。

|| *category* || *duration* ||
||          1 ||          1 ||
||          2 ||          2 ||
||          3 ||          4 ||
||          4 ||          6 ||

接下来,您需要将该查找表加入到您的books表,就像这样。该查询还可以包括expiration列,如图所示。

select b.*,
       d.duration,
       FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration
  from books b
  join (select 1 as category, 1 as duration UNION ALL
        select 2,2 UNION ALL select 3,4 UNION ALL select 4,6
         ) d ON b.category = d.category

最后,您附加一个WHERE子句过滤掉未过期的行。

select b.*,
          d.duration,
         FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration
  from books b
  join (select 1 as category, 1 as duration UNION ALL
        select 2,2 UNION ALL select 3,4 UNION ALL select 4,6
         ) d ON b.category = d.category
  where FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR >= '2016-02-03 08:00:00'

在这个例子中我使用了2016-02-03 08:00:00作为当前时间。您可以在生产系统中使用NOW().

你也可以聪明地使用sargable https://en.wikipedia.org/wiki/Sargable的版本where条款。

   where unix_time >= UNIX_TIMESTAMP('2016-02-03 08:00:00' - INTERVAL d.duration HOUR)

最后,这是一个设计偏好,但混合DATETIME和 unix 时间戳列有点奇怪。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据到期时间获取行 的相关文章

随机推荐

  • jquery UI 对话框:如何在没有标题栏的情况下初始化?

    是否可以打开没有标题栏的 jQuery UI 对话框 我认为最好的解决方案是使用该选项dialogClass jquery UI 文档摘录 在初始化期间 selector dialog dialogClass noTitleStuff 或者
  • 当 input[type="date"] 处于焦点时如何显示日历弹出窗口

    有没有办法在输入元素的焦点上激活本机 HTML5 日期选择器下拉菜单 大输入元件 目前 我只能通过单击输入元素最右侧的箭头来使用日历 大输入元素单击箭头 我想在输入元素的焦点上激活此日历 这是有问题的代码
  • 如何设置 h:selectOneRadio 按钮的默认值

    我无法设置 h selectOneRadio 的默认值 因为我需要预先选择单选按钮
  • Typo3:8.7.9 CKeditor 保存后删除块样式

    我在 Typo3 中有以下 CKEditor 的 YAML 配置 Load default processing options imports resource EXT rte ckeditor Configuration RTE Pro
  • 捕获多个异常并重新抛出一般异常

    我使用反射将一些数据添加到第三方库中的类内的私有变量中 一路上大约有四种不同的异常可以抛出 所有这些都与反射有关 而且所有这些都不太可能发生 我正在对所涉及的类和变量的名称进行硬编码 我不太可能收到任何未找到类或未找到字段的错误 除非图书馆
  • 如何在屏幕上显示PIL图像?

    我正在使用 PIL 库进行一些图像编辑 关键是 我不想每次都将图像保存在硬盘上以便在资源管理器中查看 是否有一个小模块可以让我简单地设置一个窗口并显示图像 从接近年初开始PIL教程 https web archive org web 202
  • 导入酶后加载模块 DomUtils 时出现 Webpack 错误

    我有一个使用 TypeScript 和 React 0 14 的项目 我用 karma mocha chai 设置了测试环境 以及它的工作 但是当我导入并使用酶中的函数时 我在浏览器中收到错误 来自 Chrome 的人类可读错误 Uncau
  • 将 ipad 应用程序转换为在 iPhone 上运行(通用应用程序)

    我有一个可以运行的 iPad 应用程序 现在需要在 iPhone 上运行它 我已经阅读了相当多的内容 但还没有找到一个好的答案 在这个网站上 我看到了一些讨论 但同样没有明确的答案 有谁知道有什么教程吗 我已经在我的代码中捕获了它是否是 i
  • 如何更改Flutter应用程序的名称?

    我刚刚按照以下说明制作了一个 Flutter 应用程序这一页 https codelabs developers google com codelabs first flutter app pt2 0 我用谷歌搜索了如何更改应用程序的名称
  • Java迭代固定长度的数组并使用Scanner类获取值

    如何使用固定长度为 2 的 Scanner 类获取 java 数组的值 并且它将迭代直到其值等于给定值 例如 对于以下输入 A G N H D F 我使用 Scanner 类编写了一个 for 循环来获取固定数组 road 的值 其中长度为
  • logcat 中的 Android SELinux 错误

    我的 logcat 中不断出现这些奇怪的错误 我不仅不知道它们的含义 而且不知道是什么原因造成的 它们在我的应用程序首次启动时出现 gt E SELinux 8163 Function selinux android load priori
  • SHA-1 哈希值可以全零吗?

    是否有任何输入 SHA 1 将计算为四十个零的十六进制值 即 0000000000000000000000000000000000000000 是的 这几乎是不可能的 IE 2 160 分之一 即 0 0000000000000000000
  • 如何使用 XSLT v1.0 而不是使用 XSLT v2.0 正则表达式插入文本?

    我有一个 xml 文件 它描述 除其他外 具有描述完全限定 java 类名的属性值的元素 我正在尝试编写一个 XSLT 转换来修改此文件中描述的类名 以便 例如 出现com example MyClass会变成com example Moc
  • 为什么 RichTextBox 在文档开始之前总是包含额外的字符?

    我从一个空白的 RichTextBox 开始
  • 使用 Java 进行音频混合(没有 Mixer API)

    我正在尝试混合几种不同的音频流并尝试让它们同时播放代替一次一个 下面的代码一次播放一个 我无法找出不使用 Java Mixer API 的解决方案 不幸的是 我的声卡不支持使用 Mixer API 进行同步 我被迫找出一种通过代码来实现同步
  • ASP.NET 用户控件和 jQuery 对话框

    在我的页面上 我得到了以下用户控件 div class editFormDialog style display none font size 12px div
  • searchkick 索引相关模型字段

    我有一个 Rails 应用程序 我正在从 Sphinx 切换到 ElasticSearch 并使用 gem searchkick 我有一个模型教师和一个模型标签 通过 gem 其中教师可以关联多个标签 在教师模型中 我定义了这样的索引 de
  • Razor MVC 3 RC2 - 带有动态文本的 WebGrid Actionlink

    我正在 WebGrid 中输出带有动态链接文本的 Actionlink 我可以让它工作的唯一方法如下 Grid Column header Subject columnName Message Subject format item gt
  • 在 T O 重写函数中,如何取回它?

    我在 R 会话中做了一些愚蠢的事情 我写 打印 假 现在我无法打印东西 打印 1 错误 我该如何取回它 rm不会删除基础对象 因此您只需运行 rm print 有趣的是 你can打印东西 gt print lt FALSE gt print
  • 根据到期时间获取行

    http sqlfiddle com 9 406cb 2 http sqlfiddle com 9 406cb 2 我有一本分类为 1 2 3 4 的表格书 第 1 类 将停留 1 小时 第 2 类 将停留 2 小时 第 3 类 将停留 4