Oracle SQL 开发人员时间戳格式未更改为 24

Oracle SQL developer timestamp format not changing to 24

我正在使用 python 将时间戳值插入到 Oracle 数据库中

timestamp_v = datetime.utcnow().strftime("%d-%b-%Y %H:%M:%S")
print(timestamp_v)

cur = conn.cursor()
query = 'INSERT INTO all_machines_data(timestamp, hostname, ip_address, up_time, cpu_utilization, running_processes, total_memory, available_memory, used_memory, total_disk_capacity, free_disk_space, used_disk_space, network_requests_sent, network_requests_received) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14)'
values = (timestamp_v, system_info()[1], system_info()[3], str(system_info()[2]), cpu_info()[0], cpu_info()[1], memory_info()[0], memory_info()[1], memory_info()[2], disk_info()[0], disk_info()[1], disk_info()[2], network_info()[0], network_info()[1])
cur.execute(query,values)

conn.commit()
print("Data Sent!")

>> 04-Apr-2022 23:30:22
>> Data Sent!

我的问题是 sql 开发人员不接受以 24 小时格式显示它并始终显示 12 小时格式

我尝试了我在互联网上找到的所有解决方案,但仍然没有成功1- 尝试在工具->首选项->数据库->NLS 中设置我想要的正确格式:DD-MON-YYYY HH24:MI:SS

- 尝试使用查询

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

- 尝试重新启动 sql 开发人员/停止 oracles 服务,但仍然没有成功
感谢任何帮助,谢谢!


ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP         
----------------------
2022-04-04 20:27:11.35 
1526000 

if I use ("%d-%b-%Y %H:%M:%S") in which the 24h format is %H I'm getting an error Failed to insert record into table ORA-01849: hour must be between 1 and 12 ,

您依赖于将字符串隐式转换为时间戳,这会使用您的会话 NLS 设置。请注意,这是您来自 Python 的会话,它与您的 SQL 开发人员会话是分开的 - 它们具有不同的 NLS 设置。

更改您的插入内容以期望使用 24 小时制的字符串;而不是第一个绑定只是

query="... values(:1, ..."
values = (timestamp_v, ...

成功:

query="... values(to_timestamp(:1, 'DD-MON-YYYY HH24:MI:SS`), ..."
values = (timestamp_v, ...

... 仍然回复正在转换的月份缩写 - 暗示您的 Python 和 Oracle 会话使用相同的日期语言;您可以在 Oracle 端指定语言,但是...最好使用明确的格式,例如

timestamp_v = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
...
... values(to_timestamp(:1, 'YYYY-MM-DD HH24:MI:SS`), ...
values = (timestamp_v, ...

但是绑定实际的时间戳值并且根本不使用字符串会更好。我不知道 Python 但也许像这样简单:

query="... values(:1, ..."
values = (datetime.utcnow(), ...

(This answer 表明是这种情况。)

使用正确的数据类型比在字符串之间来回转换要好得多,无论是隐式还是显式。

if I use ("%d-%b-%Y %I:%M:%S") with %I is for the 12h format, it's getting inserted no problems.

是的,因为您现在提供的时间是 11 点,而不是 23 点。

note that my sql developer is always showing the 12H format

不,它显示的是 24 小时格式,你的时间实际上是上午 11 点。