数据库中10位或13位时间戳转换为标准时间

本文详细介绍了如何处理数据库中不同位数的时间戳,包括将10位时间戳转换为标准时间,以及如何正确处理13位时间戳。通过简单的SQL检索语句示例,阐述了解决方案并分享了作者的个人经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目要读取一个数据库,其中的一个时间戳为10位,一个为13位。

1.10位时间戳转换:

其中10位时间戳准换为标准时间很简单:

简单起见,这里数据库只有一张表(test)一个字段(createTime)和一条记录(1415845484):

createTime:1415845484

则检索语句为:

select datetime(createTime, 'unixepoch', 'localtime') from message


 

2.13位时间戳转换:

其实也很简单,只是博主非计算机专业,所以对数据库也是一知半解,在这里走了很多弯路。
同上,这里数据库也只有一张表(test)一个字段(createTime)和一条记录(1415845484123)
createTime:1415845484123
select datetime(createTime / 1000, 'unixepoch', 'localtime') from message

也就是只要在检索时除以1000即可,知道真相后我眼泪掉下来。得恶补一下数据库知识了!
<think>我们正在处理的是SQLite数据库中的13位时间(毫秒级)转换为日期时间格式的问题。根据引用[1]和引用[2],SQLite提供了日期时间函数,如`datetime()`,但该函数默认处理的是以秒为单时间戳10)。因此,我们需要将13位时间(毫秒)转换为秒,即除以1000,然后使用`datetime`函数。另外,引用[2]中提到可以使用`localtime`参数来调整时区,使其显示为本地时间(例如中国时区东八区)。因此,转换步骤为:1.将13位时间除以1000,得到秒数(整数部分)。2.使用`datetime`函数,并指定'unixepoch'表示从UNIX时间戳开始,然后可以加上时区调整(如'localtime')转换为本地时间。示例SQL语句:```sqlSELECTdatetime(1714287600000/1000,'unixepoch','localtime');```解释:-1714287600000是13毫秒时间戳,除以1000得到秒数(1714287600秒)。-'unixepoch'表示这个秒数是相对于1970-01-0100:00:00UTC的。-'localtime'表示将UTC时间转换为本地时间(根据SQLite所在机器的时区设置,者如果需要指定时区,也可以使用其他修饰符,但SQLite本身不支持时区名称,只能通过偏移量,如'+8hours')。如果不需要转换为本地时间,而是保留UTC时间,则可以省略'localtime':```sqlSELECTdatetime(1714287600000/1000,'unixepoch');```另外,引用[3]中提到了使用`strftime`函数进行更灵活的格式化。`datetime`函数实际上是`strftime`的简化版。如果需要自定义格式,可以使用`strftime`:```sqlSELECTstrftime('%Y-%m-%d%H:%M:%S',1714287600000/1000,'unixepoch','localtime');```注意:SQLite的日期时间函数中,时间戳参数可以是整数浮点数(表示秒数,如果是毫秒则必须先除以1000)。因此,针对13位时间转换,我们主要采用除以1000再使用`datetime`函数的方法,并结合时区调整。下面是一个完整的示例:假设我们有一个表`events`,其中有一个整数类型的列`timestamp_ms`存储13位时间,我们要查询并转换为本地日期时间:```sqlSELECTtimestamp_ms,datetime(timestamp_ms/1000,'unixepoch','localtime')ASlocal_datetimeFROMevents;```如果时间戳字段是文本类型(虽然不常见,但有可能),我们需要先转换为整数再计算:```sqlSELECTtimestamp_ms,datetime(CAST(timestamp_msASINTEGER)/1000,'unixepoch','localtime')ASlocal_datetimeFROMevents;```关于时区:如果默认的'localtime'不是我们想要的时区,我们可以使用时区偏移。例如,转换为东八区时间(北京时间):```sqlSELECTdatetime(1714287600000/1000,'unixepoch','+8hours');```总结:核心步骤是除以1000将毫秒为秒,然后使用SQLite的日期时间函数。现在,根据用户的问题,我们提供上述方法。</think>在 SQLite 中将 **13 毫秒级时间戳** 转换为日期时间格式,需先转换为秒级时间戳再使用日期函数。以下是完整方法: ### 转换方法 ```sql -- 基本转换(UTC时间) SELECT datetime(1714287600123 / 1000, 'unixepoch') AS utc_time; -- 结果:2024-04-28 03:00:00 -- 转换为本地时间(引用[2]) SELECT datetime(1714287600123 / 1000, 'unixepoch', 'localtime') AS local_time; -- 结果:2024-04-28 11:00:00(东八区) -- 自定义格式(引用[1]) SELECT strftime('%Y-%m-%d %H:%M', 1714287600123 / 1000, 'unixepoch') AS formatted_time; -- 结果:2024-04-28 03:00 ``` ### 关键步骤解析 1. **时间戳转换** `1714287600123 / 1000` → 将 13 毫秒时间戳10 时间戳 2. **时区处理**(引用[2]) - `'unixepoch'`:声明输入为 UNIX 时间戳 - `'localtime'`:转换数据库所在时区时间(如东八区自动+8小时) 3. **格式化选项**(引用[1][3]) | 格式符 | 含义 | 示例 | |--------|------------|-------------| | `%Y` | 四年份 | 2024 | | `%m` | 两月份 | 04 | | `%d` | 两日期 | 28 | | `%H` | 24小时制 | 03/15 | | `%M` | 分钟 | 00 | | `%S` | 秒 | 00 | ### 实际应用示例 ```sql /* 查询 orders 表,将 create_time 毫秒时间戳为可读格式 */ SELECT order_id, datetime(create_time/1000, 'unixepoch', 'localtime') AS create_date, strftime('%Y-%m-%d', create_time/1000, 'unixepoch') AS short_date FROM orders WHERE create_time > strftime('%s','2024-01-01')*1000; -- 时间范围筛选(引用[3]) ``` ### 注意事项 1. **精度保留** 毫秒部分会被忽略,如需保留毫秒需额外处理: ```sql SELECT substr(datetime((create_time/1000),'unixepoch') || '.' || (create_time % 1000), 1, 23) FROM orders; ``` 2. **时区一致性** 确保数据库时区与应用时区匹配,避免时间偏移错误(引用[2]) 3. **存储优化建议** 长期使用日期数据时,建议新增 `DATE` 类型字段存储转换结果: ```sql ALTER TABLE orders ADD COLUMN create_date TEXT; UPDATE orders SET create_date = datetime(create_time/1000, 'unixepoch'); ``` > 通过 `datetime()` 和 `strftime()` 函数组合,可灵活处理不同精度和格式需求[^1][^2][^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值