Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

SQL- Sự khác biệt giữa TIMESTAMP, DATE VÀ TIMESTAMP VỚI TIMEZONE?

Các kiểu dữ liệu và sự khác biệt giữa chúng là trong tài liệu . Phiên bản ngắn là:

  • DATE có độ chính xác đến từng giây mà không hỗ trợ múi giờ;
  • TIMESTAMP có độ chính xác đến từng phần nhỏ của giây (lên đến chín chữ số thập phân, nhưng hệ điều hành của bạn cũng ảnh hưởng đến điều đó), vẫn không hỗ trợ múi giờ;
  • TIMESTAMP WITH TIME ZONE có độ chính xác tương tự như TIMESTAMP nhưng cũng có hỗ trợ múi giờ, như tên cho thấy;
  • TIMESTAMP VỚI Múi giờ địa phương điều chỉnh giá trị được lưu trữ đến và từ múi giờ địa phương của phiên tạo / truy vấn.

Bạn có thể tìm thấy bài viết này thú vị quá.

Bất cứ khi nào bạn so sánh các giá trị ngày giờ được lưu trữ trong cơ sở dữ liệu của mình, bạn nên sử dụng các giá trị của cùng một kiểu dữ liệu để so sánh. Bạn không muốn phải chuyển đổi mọi giá trị trong cột để so sánh, đặc biệt nếu cột được lập chỉ mục. Nếu bạn có cột DATE thì hãy so sánh với DATE - không so sánh dưới dạng chuỗi và không dựa vào chuyển đổi của một chuỗi. Khi bạn thực hiện:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

bạn đang dựa vào NLS_DATE_FORMAT của bạn là DD-MON-YYYY và NLS_DATE_LANGUAGE của bạn là tiếng Anh. Nếu ai đó chạy cùng một truy vấn trong một phiên khác, cài đặt của họ có thể khiến truy vấn không thành công (hoặc trong một số trường hợp, đưa ra kết quả sai, điều này có thể tồi tệ hơn). Để tránh vấn đề ngôn ngữ, tốt hơn là sử dụng số tháng thay vì tên. Nếu bạn có một biến chuỗi để so sánh, bạn nên sử dụng TO_DATE() để chuyển đổi chuỗi thành DATE bằng cách sử dụng mặt nạ định dạng đã biết cố định - không dựa vào NLS. Nếu bạn có một giá trị cố định, bạn có thể làm tương tự hoặc bạn có thể sử dụng chữ ngày , ngắn hơn và rõ ràng.

Với định dạng bạn đã sử dụng, bạn cũng đang bao gồm bất kỳ hàng nào có cột được đặt thành nửa đêm ngày 1 tháng 1 năm 2000, nhưng không bao gồm bất kỳ hàng nào muộn hơn vào ngày đó. Đó có thể là những gì bạn muốn, nhưng hãy đảm bảo rằng bạn hiểu cách BETWEEN làm. Nếu bạn thực sự đang tìm kiếm các ngày trong thập kỷ đó, kể cả bất kỳ lúc nào vào ngày 31 tháng 12 năm 1999, bạn có thể sử dụng:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Đối với dấu thời gian, bạn có thể sử dụng TO_TIMESTAMP() hoặc một ký tự dấu thời gian:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Đối với dấu thời gian có múi giờ, bạn có thể sử dụng TO_TIMESTAMP_TZ() hoặc một ký tự dấu thời gian, với một khu vực múi giờ tên:

WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00918:cột được xác định một cách mơ hồ, tôi đang gặp lỗi này

  2. Các hàng Oracle JDBC batchUpdate bị ảnh hưởng luôn là -2 (Statement.SUCCESS_NO_INFO)

  3. Kết nối với Oracle DB bằng Ruby

  4. Tạo ứng dụng Java trong Oracle JDeveloper, Phần 1

  5. tên bảng động trong câu lệnh chọn