Tôi có một Oracle DB với một timestamp
trường trong đó. Mã SQL chính xác để chèn timestamp
vào trường này là gì?
Tôi có một Oracle DB với một timestamp
trường trong đó. Mã SQL chính xác để chèn timestamp
vào trường này là gì?
Câu trả lời:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
nếu bạn muốn dấu thời gian hiện tại được chèn thì:
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATE
thay vì TO_TIMESTAMP
?
INSERT
câu lệnh đơn giản này , nhưng nói chung bạn không muốn sử dụng các biến ràng buộc như thế này. Việc chuyển đổi kiểu trong câu lệnh đầu tiên của bạn khiến nó không bị ràng buộc nhạy cảm, điều này hạn chế khả năng tạo kế hoạch tốt của Oracle. Trình tối ưu hóa có thể hoạt động tốt hơn nếu bạn sử dụng values (:ts_val)
thay thế, giả sử: ts_val ánh xạ trực tiếp đến dấu thời gian.
to_timestamp
sẽ gây ra một kế hoạch thực thi sai cho một câu lệnh SQL có thể lập kế hoạch không? Tôi có thể đưa ra một ví dụ về cách nó sẽ không. Thay vào đó, điều mà tôi nghĩ tất cả chúng ta đều muốn tránh là sự ép buộc kiểu dữ liệu không mong muốn ngăn cản việc sử dụng thao tác nguồn hàng dự kiến (tức là thao tác tối ưu).
Loại phụ thuộc vào giá trị bạn muốn chèn đến từ đâu. Nếu bạn muốn chèn thời gian hiện tại, bạn có thể sử dụng CURRENT_TIMESTAMP
như được hiển thị trong các câu trả lời khác (hoặc SYSTIMESTAMP
).
Nếu bạn có thời gian là một chuỗi và muốn chuyển nó thành dấu thời gian, hãy sử dụng biểu thức như
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
Tôi hy vọng rằng các thành phần định dạng thời gian là tự giải thích, ngoại trừ điều đó FF3
có nghĩa là 3 chữ số của độ chính xác dưới giây. Bạn có thể tăng độ chính xác lên đến 6 chữ số.
Nếu bạn đang chèn từ một ứng dụng, câu trả lời tốt nhất có thể phụ thuộc vào cách giá trị ngày / giờ được lưu trữ trong ngôn ngữ của bạn. Ví dụ, bạn có thể ánh xạ các đối tượng Java nhất định trực tiếp vào một TIMESTAMP
cột, nhưng bạn cần phải hiểu các JDBC
ánh xạ kiểu.
Tôi thích ký tự dấu thời gian ANSI:
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
Thêm chi tiết trong hướng dẫn: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'
tôi gặp lỗi này: ORA-01882: không tìm thấy vùng múi giờ
Chèn ngày trong sql
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Nếu giả sử chúng tôi muốn chèn ngày hệ thống
insert
into tablename (timestamp_value)
values (sysdate);
Trước hết, bạn cần tạo trường Nullable, sau đó đơn giản như vậy - thay vì đặt một giá trị, hãy đặt mã này CURRENT_TIMESTAMP
.
Để tham khảo tương lai của riêng tôi:
Với cx_Oracle, sử dụng cursor.setinputsize (...):
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
Không cần chuyển đổi trong db. Xem Tài liệu Oracle
Người ta có thể đơn giản sử dụng
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
Bằng cách này, bạn sẽ không phải lo lắng về chuỗi định dạng ngày, chỉ cần sử dụng định dạng dấu thời gian mặc định.
Hoạt động với Oracle 11, không có ý tưởng nếu nó làm cho các phiên bản Oracle trước đó.