Wprowadzenie
Typy danych to atrybuty określające rodzaj danych, które mogą być przechowywane przez obiekty, takie jak kolumny, zmienne lokalne, wyrażenia i parametry. W świecie RDBMS typy danych są zazwyczaj pogrupowane w ciągi, numery i typy danych.
T-SQL obsługuje 6 typów danych daty i godziny, a mianowicie:
- Data i godzina
- Mała data/godzina
- Data
- Czas
- Data i godzina2
- Przesunięcie daty i godziny
Pierwsze dwa typy danych są uważane za starsze wersje nowszych. W tym artykule skupimy się na typach danych dat, a w szczególności na datetime i datetime2 typy danych dostępne w SQL Server. Tabela 1 zawiera szczegółowe informacje o różnych typach danych daty i godziny dostępnych w SQL Server.
[identyfikator tabeli=59 /]
Typy danych daty i godziny na karcie 1
Data i godzina2
Datatime to typ danych, który łączy datę z czasem w formacie 24-godzinnego zegara. Zakres dat obsługiwany w typie danych datetime jest pokazany w Tab. 1 i ma dokładność około 3 milisekund.
Datetime2 jest rozszerzeniem typu danych datetime. Obsługuje szerszy zakres możliwych wartości i ma dokładność 100 nanosekund, co jest znacznie lepszą niż jego poprzednik. Innym kluczowym aspektem typu danych dattime2 jest to, że wymagana pamięć wynosi od 6 do 8 bajtów, w zależności od wybranej precyzji.
- Możesz osiągnąć dokładność 1 milisekundy, dopuszczając trzy miejsca po przecinku w składniku sekund. Każda wartość zajmie więc sześć bajtów.
- Możesz osiągnąć precyzję 100 nanosekund, zezwalając na siedem miejsc po przecinku w składniku sekund. Każda wartość zużyje w ten sposób osiem bajtów.
Demonstracje
Wstaw nieprawidłowe wartości dat
Tworzymy tabelę ze szczegółami pokazanymi na Listingu 1, aby przeprowadzić kilka demonstracji, które ilustrują, jak manipulować datetime i datetime2 typy danych.
-- Listing 1 Create Table and insert Rows -- Create Table with Data Types use Practice2017 go create table staffers ( fname varchar(50), lname varchar(50), JobTitle varchar(100), DOB datetime, PreciseDOB datetime2, LastLoginTime time) go
Następnie próbujemy wypełnić tabelę jednym wierszem, jak pokazano na Listingu 2, ale otrzymujemy błąd pokazany na Rys. 1. Słowem kluczowym w komunikacie o błędzie są wartości „poza zakresem”. Oznacza to, że jej wartość, którą próbujemy wstawić, jest albo niższa niż 01 stycznia-1753 lub wyższy niż31 grudnia-9999 . W tym przypadku problem polega na tym, że nie użyliśmy zalecanego formatu wpisu „RRRRMMDD gg:mm:ss.nnn ” (zob. tabela 1). Odczytywanie wartości „06101979 „, SQL Server zakłada, że 0610 to rok (odpowiadający YYYY). Ten błąd nie jest zgłaszany dla typu danych datetime2, ponieważ zakres dla datetime2 jest szerszy, począwszy od roku 0001.
-- Listing 2 Insert Rows with Wrong Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06101979' ,'06101979' ,'8:00 AM' )
Rys. 1 Błąd zwracany dla kolumny daty i godziny
Wstaw prawidłowe wartości dat
Próbujemy rozwiązać problem, wprowadzając poprawny format wpisu dla kolumny daty i godziny, jak pokazano na Listingu 3. Po ponownym uruchomieniu instrukcji otrzymujemy błąd przedstawiony na Rys. 2. Ten błąd jest zasadniczo spowodowany tym samym nieprzestrzeganiem instrukcji specyfikacje formatu wpisu. Jednak problem tkwi w drugiej części daty „06101979 ‘, który pasuje do formatu wpisu ‘RRRRMMDD gg:mm:ss.nnn ”. W tym przypadku SQL Server założył 19 Czy miesiąc i 79 to dzień miesiąca. Próba tej niejawnej konwersji kończy się niepowodzeniem, ponieważ żadne z poprzednich stwierdzeń nie jest prawdziwe.
-- Listing 3 Insert Rows with One Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01061979' ,'8:00 AM' )
Rys. 2 Błąd zwracany dla kolumny Datetime2
Listing 4 pozwala nam zademonstrować ostatnie twierdzenie. Wartość 01101201 mieści się w zakresie dla datetime2 i jesteśmy w stanie wstawić wiersz. Ta wartość przekłada się na 1st December 0110, jak widać na rys. 3.
-- Listing 4: Insert Rows with Correct Date Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01101201' ,'8:00 AM')
-- Listing 5: Insert Rows with All Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'19791006' ,'8:00 AM' )
Weryfikacja danych
Rys. 3 Zapytanie o zestaw danych
Kiedy wysyłamy zapytanie do tabeli staffers, widzimy wyraźnie dokładność typu danych datetime w porównaniu z alternatywą datetime2. Przejdźmy do czegoś bardziej złowrogiego:Ustawienia języka. Spójrz na Listing 6. Wstawiamy dokładnie te same rekordy, używając formatu daty 06/10/1979 . Ten format NIE jest neutralny językowo, więc gdy ustawimy język na brytyjski w pierwszym oświadczeniu, a następnie w us_english w drugim stwierdzamy, że wstawiliśmy dwie różne daty, chociaż nasze surowe wartości są takie same. Dlatego tak ważne jest, aby zawsze używać zalecanego formatu wpisu w przypadku datetime i datetime2 .
-- Listing 6: Impact of Language Settings set language british insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' ) set language us_english insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' )
Rys. 4 Pytania do personelu
Z ustawieniem języka jako brytyjski , SQL Server interpretuje pierwsze dwie cyfry jako dzień, ale z ustawieniem języka jako us_english , SQL Server interpretuje dwie pierwsze cyfry jako miesiąc. Ostatnią rzeczą, o której musimy tutaj wspomnieć, jest to, że wstawiając nasze rekordy, nie określiliśmy składnika czasu, dlatego SQL Server automatycznie przyjmuje, że była to średnia północ określonej daty.
Wniosek
W tym artykule dowiedzieliśmy się, jak wyglądają typy danych datetime i datetime2, ich kluczowe różnice oraz jak upewnić się, że wprowadzasz poprawną datę podczas korzystania z tych typów danych. W trakcie tego zbadaliśmy również dwa błędy, które programista może napotkać podczas pracy z tymi typami danych.
Referencje
- Typy danych SQL
- Ben-Gan, I. (2016) Podstawy T-SQL. s.74-78. Microsoft Press.