2011-08-24 8 views
5

Mam bazę danych używającą czasu unix dla dat (używam mySQL). Chcę odzyskać daty w formacie dziennym. To jest mój kwerendy:Jak przekonwertować czas UNIX przed 1970 do formatu daty w MySQL?

SELECT FROM_UNIXTIME(time_created) FROM member 

To działa prawidłowo z datami po roku 1970 (na przykład 1314162229), ale nie działa dla dat przed 1970 (na przykład -769338000). Czy jest tu jakaś praca?

Odpowiedz

9

Możliwe obejście byłoby mieć stałą poręczność odpowiadającą sekundom w określonej liczbie lat (najlepiej wielokrotność 4). Możesz dodać tę stałą, przetłumaczyć czas, a następnie odjąć wybraną liczbę lat.

Przykład: wybierz 40 lat.

Ustal Constant:

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) 

Teraz możesz każdy unix timestamp x między 1930 i 20xx i używać go.

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

Z Twojego przykład -769338000, masz

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

Używanie tego, dziękuję :) –

-3

Do mojej wiedzy nie jest ma czegoś takiego jak czas uniksowy przed 1/1/1970 00:00 UTC. Więcej pod adresem Wikipedia.

+0

Czy to znaczy, że nie należy wykorzystywać czas uniksowy jeśli idę do przechowywania dat starszych niż 1970 (jak urodziny)? –

+2

Pewnie, że jest. Z twojego własnego linku: 'To może być przedłużone również wstecz od epoki, używając liczb ujemnych; w ten sposób 1957-10-04T00: 00: 00Z, 4 472 dni przed epoką, jest reprezentowany przez uniksowy numer czasu -4 472 × 86 400 = -386 380 800. – Jacob

+0

@cularis: tęskniłem za tą częścią i, aby być Szczerze mówiąc, nigdy nie widziałem, żeby tak było. Jedyny czas, że ja osobiście potrzebowałem zrobić wszystko z historycznymi datami miałem rzeczy wracające do 1200s, więc nigdy nie pojawił się czas UNIX. Zauważyłem, że artykuł o rodzeństwie do tego, z którym się połączyłem, mówi ["Niektóre systemy poprawnie obsługują ujemne wartości czasu, podczas gdy inne nie".] (Http://en.wikipedia.org/wiki/Time_t). Sądzę, że o tym właśnie myślałem. –

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