sql >> Databasteknik >  >> RDS >> Mysql

MySQL tidszoner

Som standard (åtminstone på Debian-baserade installationer) laddas ingen tidszonsdata in i MySQL. Om du vill testa om de är laddade, försök att köra:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Om den returnerar en DATETIME (i det här fallet 2012-06-07 08:00:00 ), har du tidszoner inlästa. Om den returnerar NULL , det är de inte. När den inte är inläst är du begränsad till att konvertera med förskjutningar (t.ex. +10:00 eller -6:00 ).

Detta borde fungera bra i många fall, men det finns tillfällen då det är bättre att använda namngivna tidszoner, som för att inte oroa dig för sommartid. Genom att köra följande kommando laddas tidszonsdata från systemet (endast Unix. Jag är inte säker på vad motsvarande Windows-kommando skulle vara):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Om du ständigt behöver förlita dig på MySQL-tidszoner, bör kommandot ovan utföras varje gång systemets tidszon uppdateras . Du kan också lägga till det i ett vecko- eller månadsjobb för att göra det automatiskt åt dig.

Sedan, för att se en lista över tidszoner, gör du bara följande:

USE mysql;
SELECT * FROM `time_zone_name`;

Observera att tidszonsinformationen tar upp cirka 5 MB i MySQL. Om du någonsin vill ta bort tidszonsinformationen, kör bara följande och starta om MySQL:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

För inte DROP dessa tabeller eller dåliga saker kommer att hända.

Redigera:

Baserat på en användarkommentar nedan, om du vill att tidszonerna ska uppdateras automatiskt när du uppdaterar systemet, måste du först tillåta root att logga in utan att bli tillfrågad om ett lösenord.

MySQL>=5.6.6

Kör följande [källa ]:

mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6

Skapa en ~/.my.cnf fil (om den inte finns ännu) och lägg till följande:

[client]
user=root
password=yourMysqlRootPW

Kör sedan chmod 600 ~/.my.cnf för att se till att ingen annan kan läsa den.

Uppdatera skript

Lägg till följande skript till crontab för att köras en gång om dagen:

#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24   
# hours and do not have ".tab" in the name (since these are not timezone files) 
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo "Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo "Done!\n"
fi

Ta bort echo rader om du inte vill ha någon utdata.

Obs:Detta är (för det mesta) opröstat. Meddela mig om du har några problem så uppdaterar jag det här svaret.



  1. Spåra databasändringar med hjälp av källkontroll för arbetsmapp

  2. Hur anropar jag en lagrad procedur med argument med sqlcmd.exe?

  3. Hur man släpper främmande nyckelbegränsningar i SQL Server-databasen för alla tabeller - SQL Server / TSQL Tutorial Del 72

  4. skript för att konvertera mysql dump sql-fil till format som kan importeras till sqlite3 db