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

Chuyển đổi các giá trị âm từ FROM_UNIXTIME

Thay vào đó, chúng tôi có thể làm điều này:

FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND

FROM_UNIXTIME chức năng bị giới hạn bởi phạm vi cho phép đối với TIMESTAMP datatype, là dải int 32-bit không dấu tiêu chuẩn 1970-01-01 đến 2038-01-something. Phần mềm khác đã được cập nhật để hỗ trợ số nguyên có ký 64-bit, nhưng MySQL vẫn chưa cung cấp chức năng đó (ít nhất là không phải trong 5.1.x).

Giải pháp trong MySQL là tránh sử dụng TIMESTAMP kiểu dữ liệu và sử dụng DATETIME kiểu dữ liệu thay vào đó, khi chúng ta cần một phạm vi lớn hơn (ví dụ:các ngày trước ngày 1 tháng 1 năm 1970).

Chúng tôi có thể sử dụng DATE_ADD hàm để trừ giây từ ngày 1 tháng 1 năm 1970, như thế này:

SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)

N.B. Bạn có thể sẽ cần tính đến "chênh lệch" múi giờ so với UTC khi thực hiện các loại tính toán đó. MySQL sẽ diễn giải các giá trị DATETIME như được chỉ định trong time_zone cài đặt của phiên MySQL hiện tại, thay vì UTC (time_zone = '+00:00' )

THEO DÕI:

Hỏi: Được rồi, Có nghĩa là nếu chúng ta chọn ngày bên dưới '1970-01-01 00:00:00' thì giá trị âm được lưu trong db khác giá trị đó sẽ là giá trị dương. Đúng? - genic mềm

A: Uhhh, không. Nếu bạn chọn giá trị ngày tháng / datetime trước ngày 1 tháng 1 năm 1970, MySQL sẽ trả về giá trị DATE hoặc DATETIME trước ngày 1 tháng 1 năm 1970. Nếu bạn lưu trữ các giá trị DATE hoặc DATETIME trước ngày 1 tháng 1 năm 1970, thì MySQL sẽ lưu trữ giá trị DATE hoặc DATETIME trước ngày 1 tháng 1 , 1970, trong phạm vi cho phép được hỗ trợ bởi các kiểu dữ liệu đó. (giống như 0001-01-01 đến 9999?)

Nếu bạn cần lưu trữ các số nguyên dương và âm thực sự lớn trong cơ sở dữ liệu, bạn có thể lưu trữ chúng trong một cột được định nghĩa là BIGINT .

Biểu diễn nội bộ của cột DATE yêu cầu 3 byte bộ nhớ và DATETIME yêu cầu 8 byte bộ nhớ (tối đa MySQL phiên bản 5.6.4. Biểu diễn nội bộ và lưu trữ các giá trị DATE và DATETIME đã thay đổi trong 5.6.4)

Vì vậy, không, MySQL không lưu trữ các giá trị ngày trước năm 1970 dưới dạng "số nguyên âm".

Nếu bạn nghĩ về nó một chút, MySQL có thể tự do triển khai bất kỳ cơ chế lưu trữ nào họ muốn. (Và mỗi công cụ lưu trữ có thể tự do tuần tự hóa phần biểu diễn đó vào đĩa theo cách nào nó muốn.)

Tại sao 3 byte cho một ngày?

Một tùy chọn mà MySQL có (và tôi không đại diện rằng đây là cách nó được thực hiện) có thể là chia nhỏ ngày thành các thành phần năm và tháng.

Biểu diễn các giá trị số nguyên trong phạm vi - yêu cầu -

  • 0 - 9999 - 14 bit

  • 0 - 12 - 4 bit

  • 0 - 31 - 5 bit

Đó là tổng cộng 23 bit, ngẫu nhiên phù hợp với 3 byte một cách thủ công. Điều này chỉ chứng tỏ rằng MySQL không cần thiết phải biểu diễn các giá trị ngày trước ngày 1 tháng 1 năm 1970 dưới dạng số nguyên âm, vì vậy chúng ta không nên đưa ra giả định rằng nó đúng. (Nhưng chúng tôi thực sự chỉ quan tâm đến mức độ chi tiết này nếu chúng tôi đang làm việc trên một công cụ lưu trữ cho MySQL.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn giá trị Mảng chèn vào một ID duy nhất vào cơ sở dữ liệu mysql bằng php và PDO

  2. Truy vấn SELECT thứ hai nếu SELECT đầu tiên trả về 0 hàng

  3. Sự khác biệt giữa BIT và TINYINT trong MySQL là gì?

  4. Tạo số sê-ri trong truy vấn mysql

  5. Cách cập nhật phiên bản mysql trong xampp (lỗi với innodb_additional_mem_pool_size)