Mysql
 sql >> база данни >  >> RDS >> Mysql

Преобразуване на отрицателни стойности от FROM_UNIXTIME

Вместо това можем да направим това:

FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND

FROM_UNIXTIME функцията е ограничена от допустимия диапазон за TIMESTAMP тип данни, който е стандартният 32-битов неподписан INT диапазон от 1970-01-01 до 2038-01-нещо. Друг софтуер е актуализиран, за да поддържа 64-битови подписани цели числа, но MySQL все още не предоставя тази функционалност (поне не в 5.1.x).

Обходното решение в MySQL е избягване на използването на TIMESTAMP тип данни и използване на DATETIME вместо тип данни, когато имаме нужда от по-голям диапазон (напр. дати преди 1 януари 1970 г.).

Можем да използваме DATE_ADD функция за изваждане на секунди от 1 януари 1970 г., както следва:

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

N.B. Вероятно ще трябва да вземете предвид "отместванията" на часовата зона спрямо UTC при извършването на тези видове изчисления. MySQL ще интерпретира стойностите на DATETIME като посочени в time_zone настройка на текущата сесия на MySQL, а не UTC (time_zone = '+00:00' )

ПОСЛЕДВАНЕ:

В: Добре, означава, че ако изберем дати под '1970-01-01 00:00:00', тогава отрицателната стойност се записва в db, иначе би била положителна. нали така? – soft genic

А: Ъъъъъ, не. Ако изберете стойности за дата/дата и час преди 1 януари 1970 г., MySQL ще върне стойностите за DATE или DATETIME преди 1 януари 1970 г. Ако съхраните стойности за DATE или DATETIME преди 1 януари 1970 г., тогава MySQL ще съхрани стойността DATE или DATETIME преди 1 януари , 1970 г., в рамките на допустимия диапазон, поддържан от тези типове данни. (нещо като 0001-01-01 до 9999?)

Ако трябва да съхранявате наистина големи положителни и отрицателни цели числа в базата данни, вероятно ще ги съхранявате в колона, дефинирана като BIGINT .

Вътрешното представяне на колона DATE изисква 3-байта място за съхранение, а DATETIME изисква 8-байта съхранение (до MySQL версия 5.6.4. Вътрешното представяне и съхранение на стойностите DATE и DATETIME се промени в 5.6.4)

Така че не, MySQL не съхранява стойности за дати преди 1970 г. като "отрицателни цели числа".

Ако се замислите малко, MySQL е свободен да приложи какъвто пожелае механизъм за съхранение. (И всяка машина за съхранение е свободна да сериализира това представяне на диск, както пожелае.)

Защо 3 байта за дата?

Една от опциите, която MySQL има (и аз не твърдя, че това е начинът, по който се прави) може да бъде да раздели датата на компоненти за годината и деня.

Представянето на целочислени стойности в диапазона - изисква -

  • 0 - 9999 - 14 бита

  • 0 - 12 - 4 бита

  • 0 - 31 - 5 бита

Това са общо 23 бита, които се побират удобно в 3 байта. Това само демонстрира, че не е необходимо MySQL да представя стойностите за дата преди 1 януари 1970 г. като отрицателни цели числа, така че не трябва да правим предположението, че го прави. (Но наистина бихме били загрижени само за това ниво на детайлност, ако работихме върху машина за съхранение за 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. добавете колона към таблицата на mysql, ако тя не съществува

  2. Каква е разликата между cachePrepStmts и useServerPrepStmts в MySQL JDBC драйвер

  3. SQL заявка поне едно от нещо

  4. Получавайте WP публикации на базата на множество двойки мета ключ/стойност, използвайки IN

  5. Как да изберете всички записи, които са 10 минути в рамките на текущата времева марка в MySQL?