Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj „smalldatetime” na „datetimeoffset” w SQL Server (przykłady T-SQL)

Ten artykuł zawiera przykłady konwersji smalldatetime wartość na przesunięcie daty i godziny wartość w SQL Server.

Po przekonwertowaniu smalldatetime wartość przesunięcie daty i godziny , smalldatetime wartość jest kopiowana do przesunięcia daty i godziny wartość. Ułamki sekund są ustawione na 0, a przesunięcie strefy czasowej na +00:00.

smalldatetime typ danych nie ma żadnych ułamków sekund, a jego składnik sekund jest zawsze ustawiony na zero (:00). Jego dokładność jest do najbliższej minuty.

przesunięcie daty i godziny z drugiej strony typ danych umożliwia określenie dokładności ułamka sekundy od 0 do 7. Jeśli tego nie określisz, użyje 7 (wartość domyślna). Ma również przesunięcie strefy czasowej i może zachować wszelkie przesunięcia w oryginalnej wartości. Jednak smalldatetime nie ma świadomości strefy czasowej, więc nie ma żadnych wartości do zachowania. W takim przypadku przesunięcie strefy czasowej jest ustawione na +00:00.

SQL Server faktycznie ma funkcję TODATETIMEOFFSET() funkcja, która jest specjalnie zaprojektowana do konwersji wartości daty/czasu na przesunięcie daty/czasu i dodaj przesunięcie strefy czasowej. Jednak poniżej znajdują się moje komentarze i kilka przykładów dotyczących tej opcji.

Przykład 1 – Konwersja niejawna

Po pierwsze, oto przykład niejawnej konwersji między smalldatetime i przesunięcie daty i godziny .

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Wynik:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W takim przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać smalldatetime wartość na przesunięcie daty i godziny zmienna.

Widzimy, że przesunięcie daty i godziny zmienna ma część ułamkową ( 0000000 ), natomiast smalldatetime wartość nie ma części ułamkowej, a jej minuty zostały zaokrąglone w górę podczas przypisywania jej wartości początkowej. przesunięcie daty i godziny wartość obejmuje również przesunięcie strefy czasowej o +00:00 .

Użycie dokładności 7 ułamków sekund powoduje przesunięcie daty i godziny użyć 11 bajtów do przechowywania (10 bajtów na przechowywanie danych, 1 bajt na precyzję). Dla porównania smalldatetime używa tylko 4 bajtów. Możesz jednak zmniejszyć dokładność przesunięcia daty i godziny wartość, zastępując 7 mniejszą liczbą. Jeśli chcesz całkowicie usunąć część ułamkową sekund, po prostu użyj datetimeoffset(0) . Spowoduje to zmniejszenie rozmiaru pamięci do 9 bajtów (w tym 1 dla precyzji).

Przykład 2 – Jawna konwersja za pomocą CAST()

Oto przykład jawnej konwersji. W tym przypadku używam CAST() działać bezpośrednio w SELECT oświadczenie o jawnej konwersji między smalldatetime i przesunięcie daty i godziny .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Wynik:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Przykład 3 – Jawna konwersja przy użyciu funkcji CONVERT()

Oto przykład jawnej konwersji przy użyciu CONVERT() funkcja zamiast CAST() .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';

Wynik:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Przykład 4 – Zmiana przesunięcia strefy czasowej

Fakt, że konwertujesz swój smalldatetime wartości do przesunięcie daty i godziny oznacza, że ​​prawdopodobnie robisz to dla przesunięcia strefy czasowej. I prawdopodobnie chcesz ustawić inne przesunięcie niż +00:00 (domyślne przesunięcie).

Na szczęście możesz użyć TODATETIMEOFFSET() funkcja zmiany przesunięcia.

Możesz także użyć tej funkcji, aby przekonwertować oryginalny smalldatetime wartość na przesunięcie daty i godziny wartość. Ta funkcja akceptuje wartość daty/czasu (która może zostać przekształcona w datetime2 wartość) oraz wartość przesunięcia.

Oto przykład:

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset';

Wynik:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

A oto przykład użycia funkcji w SELECT oświadczenie:

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Wynik:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

Jedna ważna kwestia dotycząca TODATETIMEOFFSET() funkcja polega na tym, że używa tej samej dokładności ułamkowej, co przekazany do niej argument daty/godziny. W tym przypadku jest to smalldatetime argument, który nie ma ułamków sekund.

Mój system zwraca końcowe zera z przesunięciem daty i godziny część ułamkowa, jednak możesz zobaczyć coś takiego:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

Tak czy inaczej, nadal możesz w pełni wykorzystać przesunięcie daty i godziny precyzja typu danych, jeśli chcesz później zmienić wartość.

Oto przykład, w którym użyto DATEADD() funkcja do zmiany ułamków sekund po zakończeniu konwersji.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Wynik (przy użyciu wyjścia pionowego):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wersja zaplecza nie jest obsługiwana do projektowania diagramów lub tabel bazy danych

  2. Ulepszenia tempdb w SQL Server 2019

  3. SQL wybierz max(data) i odpowiednią wartość

  4. Jak zainstalować Azure Data Studio na komputerze Mac

  5. Odpytywanie połączonego serwera sql