【问题标题】:Perform date operations in a query在查询中执行日期操作
【发布时间】:2012-01-04 15:42:07
【问题描述】:

我的数据库表包含start_time(输入date time)和duration(输入integer,表示小时数)。

我想执行查询以查找所有start_time + durationTime.now 之前的记录。

我可以在一个查询中运行添加操作和比较操作吗?还是我首先需要读取记录,将其转换为 rails 并在那里运行比较?

伪代码如下:

@surveys = Survey.find_by_sql("select * from surveys where start_time  + duration < :now", :now => Time.now)

【问题讨论】:

  • 日期函数是特定于数据库的。你在用什么?
  • 例如:MySQL、PostgreSQL、SQLServer、Oracle等...?
  • 谢谢,实际上我想使用 rails 标准:sqlite 用于开发,MySQL 用于生产。可能在开始时执行添加 start_time + duration 并将其作为新值(例如 end_time)存储在表中更有意义。那么我不会是特定于数据库的,对吧?
  • Sqlite 没有内置的日期时间数据类型(请参见此处:sqlite.org/datatype3.html)。您如何将 start_time 存储在您的 sqlite 数据库中,这与您的 MySQL 数据库相比如何?
  • 谢谢马克,可以在 sqlite db 中创建一个类型为 datetime 的列,当我打印模式时它仍然声明它。在内部,它存储为亲和性 NUMERIC。但据我了解,没有机会运行与数据库无关的操作,例如向其添加小时数(从不同的列读取)。

标签: mysql sql ruby-on-rails sqlite


【解决方案1】:

从技术上讲,是的,您可以按照自己的方式进行操作,但是您必须使用特定于您的数据库引擎的日期时间函数(您没有指定)

【讨论】:

  • 同意 - 我见过的几乎每个 RDBMS 都有稍微不同的处理日期/时间的方法。可能是您的应用程序中无法使数据库独立的事情之一。
【解决方案2】:

如果你使用的是 ms-sql-server,将时间转换为浮点数,它的基是 1.0 = 1 天。

选择 * 从你的表 其中 (CONVERT(FLOAT,start_time)+duration/24.0)

应该得到你想要的。

【讨论】:

  • -1 - 并非所有日子都是 24 小时(取决于时区)。我会避免像瘟疫那样做任何类似的“数学”诡计,因为它们允许出现细微的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2011-05-04
  • 2016-04-19
  • 2010-11-05
  • 2019-04-27
  • 2015-10-28
  • 2016-09-22
相关资源
最近更新 更多