如何从 SQLite3 和 PostgreSQL 中的时间戳中选择日期

Posted

技术标签:

【中文标题】如何从 SQLite3 和 PostgreSQL 中的时间戳中选择日期【英文标题】:How to select just date from timestamp in SQLite3 and PostgreSQL 【发布时间】:2010-12-15 18:46:26 【问题描述】:

在我的 Rails 项目中,我有一个包含时间戳行的分数表,我需要查询并查找每天的最新记录。我的生产数据库是 PostgreSQL,虽然我在 sqlite3 中本地开发/测试。

我在构建 SQL 查询以仅从时间戳中提取日期时遇到问题。所以如果这是时间戳:2010-12-13 23:03:40.485012+0000,那么我只需检查 2010-12-13 并忽略时间。

Scores table:

id          :integer  
name        :string  
score       :integer  
updated_at  :timestamp  

而且由于每个名称每天都有多行,因此我想查找每天的 MAX 时间戳,并查看每个名称每天的最新分数。

我尝试过使用 DATE() 函数,但没有任何运气。有人知道这样做的最佳方法吗?

【问题讨论】:

【参考方案1】:

在the SQLite date functions 中,您需要一个冒号来分隔时区中的小时和分钟。

sqlite> select date('2010-12-13 23:03:40.485012+0000');
[NULL]
sqlite> select date('2010-12-13 23:03:40.485012+00:00');
2010-12-13

我的生产数据库是 PostgreSQL 虽然我在本地开发/测试 sqlite3.

这是个坏主意。使用您用于生产的同一数据库进行测试。

【讨论】:

【参考方案2】:

对于 PostgreSQL,您可以使用:

CAST(updated_at AS DATE)

【讨论】:

谢谢,首先尝试在本地获取可以与 SQLite3 一起使用的东西。不知道为什么“SELECT DATE(updated_at) from Scores”不起作用。 根据 SQLLite 手册 DATE() 将字符串转换为 DATE,它不会从时间戳中提取日期。有点跑题了,但我绝不建议使用与生产环境不同的 DBMS 来测试应用程序。【参考方案3】:

在 PostgreSQL 中你可以使用::

declare _now timestamp with time zont := now();
declare dt date := _now::date;

【讨论】:

以上是关于如何从 SQLite3 和 PostgreSQL 中的时间戳中选择日期的主要内容,如果未能解决你的问题,请参考以下文章

在迁移中更改自动增量值(PostgreSQL 和 SQLite3)

PostgreSQL Node.js 服务器中的 SQLite3 each() 函数的等价物?

Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库

Django shift to PostgreSQL 无法导入fixture,说明数据太长

如何使用 Swift 从 tableview 和 sqlite3 中删除

Django:将数据从 SQLite 移动到 PostgreSQL