sql >> Database >  >> RDS >> Oracle

SQL- Verschil tussen TIMESTAMP, DATE EN TIMESTAMP MET TIMEZONE?

De gegevenstypen en de verschillen daartussen zijn in de documentatie . De korte versie is:

  • DATE heeft een precisie tot op een seconde zonder ondersteuning voor tijdzones;
  • TIMESTAMP heeft een precisie tot op een fractie van een seconde (tot negen decimalen, maar uw besturingssysteem heeft daar ook invloed op), nog steeds zonder ondersteuning voor tijdzones;
  • TIMESTAMP MET TIME ZONE heeft dezelfde precisie als TIMESTAMP maar heeft ook ondersteuning voor tijdzones, zoals de naam al doet vermoeden;
  • TIMESTAMP MET LOKALE TIJDZONE past de opgeslagen waarde aan van en naar de lokale tijdzone van de aanmaak/opvraagsessie.

Mogelijk vindt u dit artikel ook interessant.

Telkens wanneer u datetime-waarden vergelijkt die zijn opgeslagen in uw database, moet u waarden van hetzelfde datatype gebruiken om mee te vergelijken. U wilt niet elke waarde in de kolom voor vergelijking moeten converteren, vooral als de kolom is geïndexeerd. Als je een DATE-kolom hebt, vergelijk dan met een DATE - vergelijk niet als een tekenreeks en vertrouw niet op impliciete conversie van een touwtje. Wanneer je dat doet:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

u vertrouwt erop dat uw NLS_DATE_FORMAT DD-MON-YYYY is en dat uw NLS_DATE_LANGUAGE Engels is. Als iemand anders dezelfde query uitvoert in een andere sessie, kunnen hun instellingen ervoor zorgen dat de query mislukt (of in sommige gevallen verkeerde resultaten geeft, wat nog erger kan zijn). Om het taalprobleem te vermijden is het beter om maandnummers te gebruiken in plaats van namen. Als je een stringvariabele hebt om mee te vergelijken, gebruik dan TO_DATE() om de tekenreeks naar een DATE te converteren met behulp van een vast bekend formaatmasker - vertrouw niet op NLS. Als je een vaste waarde hebt, kun je hetzelfde doen, of je kunt een letterlijke datum , wat korter en ondubbelzinnig is.

Met het formaat dat u gebruikt, neemt u ook alle rijen op waarvan de kolom is ingesteld op middernacht op 1 januari 2000, maar niet later op die dag. Dat is misschien wat je wilt, maar zorg ervoor dat je begrijpt hoe TUSSEN werken. Als u daadwerkelijk op zoek bent naar datums binnen dat decennium, inclusief op elk moment op 31 december 1999, kunt u het volgende gebruiken:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Voor tijdstempels kunt u TO_TIMESTAMP() of een letterlijke tijdstempel:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Voor tijdstempels met tijdzones kunt u ofwel TO_TIMESTAMP_TZ gebruiken () of een letterlijke tijdstempel, met de naam tijdzone regio:

WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'


  1. MariaDB GEBRUIKER() uitgelegd

  2. Hoe de naam van een beperking in Oracle te vinden

  3. Android- Gegevens worden toegewezen in de spinner, maar wanneer geselecteerd, wordt de waarde niet weergegeven in de spinner

  4. Toon één rij per zoekterm, vervang standaard indien niet gevonden