2011-08-24 38 views
5

Tôi có một cơ sở dữ liệu sử dụng thời gian unix cho các ngày của nó (tôi đang sử dụng mySQL). Tôi muốn lấy ngày tháng theo định dạng ngày hàng ngày. Đây là câu hỏi của tôi:Làm thế nào để chuyển đổi thời gian UNIX trước năm 1970 sang định dạng ngày trong MySQL?

SELECT FROM_UNIXTIME(time_created) FROM member 

này hoạt động tốt với các ngày sau năm 1970 (ví dụ 1314162229) nhưng không làm việc cho những ngày trước năm 1970 (ví dụ, -769.338.000). Có công việc nào ở đây không?

Trả lời

9

Cách giải quyết có thể là có hằng số tiện dụng tương ứng với số giây trong một số năm nhất định (tốt nhất là bội số của 4). Bạn có thể thêm hằng số này, dịch thời gian và sau đó trừ số năm đã chọn.

Ví dụ: chọn 40 năm.

Xác định hằng số:

MySQL [files]> select adddate(from_unixtime(0), interval 40 year); 
+---------------------------------------------+ 
| adddate(from_unixtime(0), interval 40 year) | 
+---------------------------------------------+ 
| 2010-01-01 01:00:00       | 
+---------------------------------------------+ 
1 row in set (0.09 sec) 

MySQL [files]> select unix_timestamp(adddate(from_unixtime(0), interval 40 year)); 
+-------------------------------------------------------------+ 
| unix_timestamp(adddate(from_unixtime(0), interval 40 year)) | 
+-------------------------------------------------------------+ 
|             1262304000 | 
+-------------------------------------------------------------+ 
1 row in set (0.09 sec) 

Bây giờ bạn có thể mỗi unix timestamp x giữa năm 1930 và 20XX và sử dụng nó.

select subdate(from_unixtime(x+1262304000), interval 40 year); 

Với ví dụ của bạn -769338000, bạn sẽ có được

MySQL [files]> select subdate(from_unixtime(-769338000+1262304000), interval 40 year); 
+-----------------------------------------------------------------+ 
| subdate(from_unixtime(-769338000+1262304000), interval 40 year) | 
+-----------------------------------------------------------------+ 
| 1945-08-15 17:00:00            | 
+-----------------------------------------------------------------+ 
1 row in set (0.09 sec) 
+0

Sử dụng này, cảm ơn bạn :) –

-3

Theo hiểu biết của tôi ở đó có những điều như UNIX thời gian trước khi 1970/01/01 00:00 UTC. Thêm tại Wikipedia.

+0

Liệu nó có nghĩa là tôi không nên sử dụng thời gian UNIX nếu tôi sẽ lưu trữ số ngày lớn hơn 1970 (như ngày sinh nhật)? –

+2

Chắc chắn là có. Từ liên kết rất riêng của bạn: 'Điều này có thể được mở rộng ngược từ thời đại, bằng cách sử dụng các số âm; do đó 1957-10-04T00: 00: 00Z, 4 472 ngày trước thời đại, được biểu thị bằng số thời gian Unix −4 472 × 86 400 = -386 380 800. ' – Jacob

+0

@cularis: Tôi đã bỏ lỡ phần đó và được thẳng thắn, tôi chưa bao giờ thấy nó được sử dụng như thế. Thời gian duy nhất mà tôi, cá nhân, cần phải làm bất cứ điều gì với những ngày lịch sử tôi đã có công cụ quay trở lại những năm 1200, do đó, thời gian UNIX không bao giờ xuất hiện. Tôi lưu ý rằng một bài báo anh chị em với người mà tôi liên kết nói ["Một ​​số hệ thống xử lý chính xác các giá trị thời gian âm, trong khi một số khác thì không."] (Http://en.wikipedia.org/wiki/Time_t). Tôi đoán đó là những gì tôi đã nghĩ đến. –

0
SELECT DATE_ADD(CAST('1970-01-01 00:00:00' AS DATETIME), INTERVAL `time_created` SECOND) FROM `member` 
2

Tôi tìm thấy một cách mới:

chuyển đổi cho đến nay MySQL:

SELECT DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second); 

chuyển đổi kỷ nguyên của bạn vào một chuỗi ngày:

SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second), '%Y-%m-%d'); 

Và lại

SELECT TIMESTAMPDIFF(second,FROM_UNIXTIME(0),'1960-01-01 00:00:00'); 

nguồn: http://www.epochconverter.com/programming/mysql-from-unixtime.php#negavtiveEpoch

Các vấn đề liên quan