关于SQLite中的纪元问题

时间:2015-03-30 16:36:26

标签: sqlite postgresql

我使用PHP和postgres完成了一个Web应用程序。现在,我正在转换为JavaScript和SQLite的同一个应用程序。我必须说,它并不太难,SQLite已经成功地解释了我在postgres中使用的相同查询。

除了这个。

SELECT SUM(t.subtotal)/MAX(EXTRACT(epoch FROM (r.fecha_out - r.fecha_in))/86400) AS subtotal,
COUNT(t.id) AS habitaciones FROM reserva_habitacion t 
LEFT JOIN reserva r ON t.id_reserva=r.id 
WHERE (r.fecha_in <= "2015-03-27" AND r.fecha_out > "2015-03-27") AND r.estado <> 5

使用FireFox插件“SQLiteManager”它告诉我错误是这部分epoch FROM,但我无法理解它。我做错了什么,我该如何解决?

欢迎任何建议!

1 个答案:

答案 0 :(得分:3)

对于关系数据库而言,异常的SQLite是完全动态类型的discussed in this manual page

相比之下,Postgres是严格类型的,并使用运算符重载,以便timestamp - timestamp为您提供interval。然后可以将interval传递给SQL标准extract()函数,在这种情况下,给出两个时间戳之间的总秒数。 (见the manual page on Date/Time functions and operators。)

在SQLite中,您没有这样的列类型,因此您有两种选择:

  • 直接将您的DateTimes存储为Unix时间戳;此时,extract epoch from是多余的,因为r.fecha_out - r.fecha_in会在几秒钟内为您提供差异。
  • 以标准格式将日期时间存储为字符串,并使用the SQLite Date and Time functions来处理它们。在这种情况下,您可以使用strftime('%s', foo)将每个值转换为Unix时间戳,例如strftime('%s', r.fecha_out) - strftime('%s', r.fecha_in)