Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

datetime vs smalldatetime di SQL Server:Apa Bedanya?

Artikel ini membahas perbedaan utama antara waktu-tanggal dan waktu kecil tipe data di SQL Server.

Kedua tipe data tersebut digunakan untuk menyimpan nilai tanggal dan waktu, namun ada perbedaan di antara keduanya. Dalam kebanyakan kasus, Anda sebaiknya menghindari kedua jenis dan menggunakan datetime2 sebagai gantinya (Microsoft juga merekomendasikan ini). Bagaimanapun, inilah perbandingan kedua tipe data ini.

Tabel berikut menguraikan beberapa persamaan dan perbedaan utama antara kedua tipe data ini.

Fitur waktu kecil datetime
Sesuai dengan SQL (ANSI &ISO 8601) Tidak Tidak
Rentang Tanggal 1900-01-01 hingga 2079-06-06 1753-01-01 hingga 9999-12-31
Rentang Waktu 00:00:00 sampai 23:59:59 00:00:00 sampai 23:59:59,997
Panjang Karakter Maksimum 19 posisi Minimum 19 posisi
maksimal 23
Ukuran Penyimpanan 4 byte, diperbaiki 8 byte, diperbaiki
Akurasi Satu menit Dibulatkan menjadi kelipatan .000, .003, atau .007 detik
Presisi kedua pecahan Tidak Ya
Presisi pecahan detik yang ditentukan pengguna Tidak Tidak
Offset Zona Waktu Tidak ada Tidak ada
Awas dan pelestarian zona waktu Tidak Tidak
Mengingat musim panas Tidak Tidak

Haruskah saya menggunakan 'datetime' atau 'smalldatetime'?

Microsoft menyarankan untuk tidak menggunakan kedua tipe data ini untuk pekerjaan baru. Anda hanya boleh menggunakannya jika Anda memiliki alasan kuat untuk menggunakannya.

Namun jika Anda harus memilih, keputusan Anda kemungkinan besar akan dibuat dengan menimbang presisi dan akurasi ekstra dari datetime vs persyaratan penyimpanan yang lebih rendah dari smalldatetime .

Dengan kata lain, jika Anda tidak membutuhkan akurasi detik, smalldatetime akan melakukan pekerjaan dengan hanya menggunakan setengah ruang penyimpanan. Di sisi lain, jika Anda memang membutuhkan akurasi hingga detik (atau bahkan beberapa detik pecahan), maka Anda harus menggunakan datetime .

Bagaimanapun, Microsoft menyarankan untuk menggunakan tanggal , waktu , datetime2 , atau datetimeoffset untuk pekerjaan baru.

Lihat waktu kecil vs datetime2 dan waktu kencan vs datetime2 untuk melihat bagaimana masing-masing jenis ini dibandingkan dengan datetime2 .

Contoh 1 – Perbandingan Dasar

Berikut adalah contoh singkat untuk menunjukkan perbedaan mendasar antara datetime dan waktu kecil .

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.555';
SET @thesmalldatetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Hasil:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Di sini, saya menyetel smalldatetime variabel dengan nilai yang sama dengan datetime variabel. Ini menyebabkan nilai dikonversi ke smalldatetime dan kemudian kita dapat menggunakan SELECT pernyataan untuk melihat nilai aktual yang ditetapkan untuk setiap variabel.

Dalam hal ini, kedua variabel membulatkan nilainya. Tapi mereka dikumpulkan secara berbeda.

waktu kencan variabel membulatkan bagian detik pecahan. Ini karena waktu kencan selalu dibulatkan ke kenaikan .000, .003, atau .007 detik.

waktu kecil variabel di sisi lain, membulatkan menit bagian. Tidak hanya itu, bagian detik disetel ke nol. Hal ini diharapkan, karena dokumentasi resmi Microsoft menyatakan bahwa smalldatetime waktu adalah ...berdasarkan 24 jam sehari, dengan detik selalu nol (:00) dan tanpa pecahan detik .

Jadi kita dapat melihat bahwa datetime type memberikan nilai tanggal/waktu yang lebih tepat dan akurat.

Contoh 2 – Menetapkan Nilai dari Literal String

Pada contoh sebelumnya, waktu kecil nilai ditetapkan dengan menyetelnya ke nilai yang sama dengan waktu tanggal nilai. Ketika kami melakukannya, SQL Server melakukan konversi implisit agar data "sesuai" dengan tipe data baru.

Ternyata, kita juga dapat menyetel smalldatetime variabel ke string literal yang sama yang menyertakan pecahan detik (meskipun tipe data ini tidak menyimpan pecahan detik).

Berikut adalah contoh di mana saya melakukan hal itu:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.555';
SET @thesmalldatetime = '2025-05-21 10:15:30.555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Hasil:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Tentu saja, hasilnya sama saat kita memilih nilai – smalldatetime nilai tidak menunjukkan pecahan detik, detik adalah nol, dan menit dibulatkan ke atas.

Namun, jika kita menggunakan lebih dari 3 tempat desimal, maka kedua tipe data akan mengembalikan kesalahan.

Kesalahan untuk waktu tanggal :

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.5555';
SET @thesmalldatetime = '2025-05-21 10:15:30.5555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Hasil:

Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.

Kesalahan untuk smalldatetime :

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.5555';
SET @thesmalldatetime = '2025-05-21 10:15:30.5555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Hasil:

Msg 295, Level 16, State 3, Line 5
Conversion failed when converting character string to smalldatetime data type.

Contoh 3 – Ukuran Penyimpanan

waktu kecil tipe data memiliki ukuran penyimpanan tetap 4 byte. Ini adalah salah satu dari sedikit manfaat smalldatetime memiliki lebih dari waktu kencan , yang memiliki ukuran penyimpanan tetap sebesar 8 byte.

Kita dapat memeriksa ukuran penyimpanan menggunakan DATALENGTH() fungsi untuk mengembalikan jumlah byte yang digunakan untuk setiap nilai kita:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  DATALENGTH(@thedatetime) AS 'datetime',
  DATALENGTH(@thesmalldatetime) AS 'smalldatetime';

Hasil

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+

Kami juga mendapatkan hasil yang sama meskipun kami mengonversinya menjadi varbinary , yang lebih mewakili bagaimana mereka sebenarnya disimpan dalam database:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime',
  DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';

Hasil

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengukur Kinerja Kueri:Biaya Kueri Rencana Eksekusi vs Waktu yang Dibutuhkan

  2. Masalah penyebaran laporan SSRS 2014

  3. cara menetapkan nilai cte ke variabel

  4. DATETIME2FROMPARTS() Contoh di SQL Server (T-SQL)

  5. Cara Memilih Subset Kolom dari Set Hasil Prosedur Tersimpan (T-SQL)