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 点。
我正在使用 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 点。