sql >> Database teknologi >  >> RDS >> Oracle

SQL- Forskel mellem TIMESTAMP, DATE OG TIMESTAMP MED TIMEZONE?

Datatyperne og forskellene mellem dem er i dokumentationen . Den korte version er:

  • DATE har præcision ned til et sekund uden tidszoneunderstøttelse;
  • TIMESTAMP har præcision ned til brøkdele af et sekund (op til ni decimaler, men dit operativsystem påvirker også det), stadig uden tidszoneunderstøttelse;
  • TIMESTAMP WITH TIME ZONE har samme præcision som TIMESTAMP, men har også tidszoneunderstøttelse, som navnet antyder;
  • TIDSSTAMPEL MED LOKAL TIDZONE justerer den lagrede værdi til og fra oprettelses-/forespørgselssessionens lokale tidszone.

Du kan muligvis finde denne artikel også interessant.

Når du sammenligner datetime-værdier gemt i din database, bør du bruge værdier af samme datatype til at sammenligne med. Du ønsker ikke at skulle konvertere hver værdi i kolonnen til sammenligning, især hvis kolonnen er indekseret. Hvis du har en DATO-kolonne, så sammenlign med en DATO - sammenlign ikke som en streng, og stol ikke på implicit konvertering af en snor. Når du gør:

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

du stoler på, at din NLS_DATE_FORMAT er DD-MON-YYYY, og at dit NLS_DATE_LANGUAGE er engelsk. Hvis en anden kører den samme forespørgsel i en anden session, kan deres indstillinger få forespørgslen til at mislykkes (eller i nogle tilfælde give forkerte resultater, hvilket kan være værre). For at undgå sprogproblemet er det bedre at bruge månedsnumre frem for navne. Hvis du har en strengvariabel at sammenligne med, skal du bruge kode>TO_DATE() at konvertere strengen til en DATO ved hjælp af en fast kendt formatmaske - stol ikke på NLS. Hvis du har en fast værdi, kan du gøre det samme, eller du kan bruge en dato bogstavelig , hvilket er kortere og entydigt.

Med det format, du brugte, inkluderer du også alle rækker, som har en kolonne sat til midnat den 1. januar 2000, men ikke senere på den dag. Det kan være, hvad du vil, men sørg for, at du forstår hvordan MELLEM arbejder. Hvis du rent faktisk leder efter datoer inden for dette årti, inklusive når som helst den 31. december 1999, kan du bruge:

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

Til tidsstempler kan du enten bruge TO_TIMESTAMP() eller et tidsstempel bogstaveligt:

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

For tidsstempler med tidszoner kan du enten bruge TO_TIMESTAMP_TZ () eller et tidsstempel, der er bogstaveligt, med et navns tidszoneområde:

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. Homebrew MySQL 8.0.18 på macOS 10.15 Catalina kører ikke som service

  2. Sådan laver du database online fra gendannelsestilstand i SQL Server

  3. Hvordan anvender man PostgreSQL UNLOGGED-funktionen til en eksisterende tabel?

  4. Hvordan indstiller man én FK (fremmednøgle) på flere borde?