【问题标题】:SQLLite - type casting in pythonSQLite - python中的类型转换
【发布时间】:2019-04-08 19:33:00
【问题描述】:

我是 python 新手。 我正在将我的表数据从 AWS Redshift 移动到内存中的 sqllite 数据库中 蟒蛇。

请参考下表结构:

红移表:

我在上列中的值字段在 Redshift 中是十进制。

当我尝试将数据带到 sqllite 时,我发现我从 Redshift 获得的结果在结果中包含 Decimal 关键字,因此我无法将其插入也标记为 Decimal 的 sqllite 表中(这是我之前提出的同一问题的link)。所以我将我的数据类型更改为 varchar(30),以便我的值可以适合 sqllite 表。

我在内存中的sqllite表请参考下面的表结构:

内存中的sqllite表

现在我想在我的 python 脚本中基于时间戳对列值求和,但我无法得到预期的结果。

这是我在 Redshift 中用来获取总和的查询,我得到了预期的输出:

select sum(value) from table where id = 9831 and item_date = '2018-11-01' and to_char(item_datetime, 'HH24MI') between '0000' and '2359';

这是我在脚本中使用的查询,用于将 value 列转换为 decimal 并将 item_datetime 转换为 strftime 以获得所需的输出:

select sum(CAST(value as decimal)) from table where id = 9831 and item_date = '2018-11-01' and strftime(item_datetime, 'HH24MI') between '0000' and '2359';

但我得到的输出为None。 云有人向我解释这种行为以及我在这里做错了什么? 如何处理这个问题?

【问题讨论】:

  • 您之前的解决方案是完全错误的。不要更改列的类型以在其中存储错误的数据。无论如何,正如您的屏幕截图所示,您在每个值的末尾都有一个单引号。
  • @DanielRoseman:感谢您的回复,我想了解处理此类数据的方法以及在 python 中通常如何实践。
  • 我认为您从 Reddit 线程中了解到,您应该将源数据转换为使用浮点数或整数,而不是字符串。
  • @DanielRoseman :是的,现在我发现将它们转换为浮点数然后插入表格而不是做这些事情应该是更好的方法。

标签: python python-3.x python-2.7 sqlite


【解决方案1】:

在 SQLite 中是这样的:

... AND STRFTIME('%H%M', item_datetime) BETWEEN '0000' AND '2359'

有关更多信息,请参阅docs

【讨论】:

  • 谢谢,让我过得愉快。非常感谢。
  • 我的输出精度下降了,请您也说明一下。
  • @ShivkumarMallesappa 尝试在您的 SELECT 中使用 DECIMAL(10,5)
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
相关资源
最近更新 更多