Pertanyaan Cara mengembalikan hanya Tanggal dari datatype DateTime SQL Server


SELECT GETDATE()

Pengembalian: 2008-09-22 15:24:13.790

Saya ingin bagian tanggal tanpa bagian waktu: 2008-09-22 00:00:00.000

Bagaimana saya bisa mendapatkannya?


1404
2017-09-22 03:31


asal


Jawaban:


Di SQL Server 2008 dan lebih tinggi, Anda harus CONVERT saat ini:

SELECT CONVERT(date, getdate())

Pada versi yang lebih lama, Anda dapat melakukan hal berikut:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

sebagai contoh

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

memberi saya

2008-09-22 00:00:00.000

Kelebihan:

  • Tidak varchar<->datetime konversi diperlukan
  • Tidak perlu dipikirkan locale

2056
2017-09-22 03:34



SQLServer 2008 sekarang memiliki tipe data 'date' yang hanya berisi tanggal tanpa komponen waktu. Siapa pun yang menggunakan SQLServer 2008 dan seterusnya dapat melakukan hal berikut:

SELECT CONVERT(date, GETDATE())

657
2017-09-24 13:02



Jika menggunakan SQL 2008 dan lebih baru:

select cast(getdate() as date)

141
2018-01-31 09:44



DATEADD dan DATEDIFF lebih baik daripada CONVERTing ke varchar. Kedua queri memiliki rencana eksekusi yang sama, tetapi rencana eksekusi sangat penting data mengakses strategi dan tidak selalu mengungkapkan biaya implisit yang terlibat dalam waktu CPU yang diambil untuk melakukan semua bagian. Jika kedua kueri dijalankan terhadap tabel dengan jutaan baris, waktu CPU menggunakan DateDiff bisa mendekati 1/3 dari waktu Konversi CPU!

Untuk melihat rencana eksekusi untuk pertanyaan:

set showplan_text on
GO 

Baik DATEADD dan DATEDIFF akan menjalankan CONVERT_IMPLICIT.

Meskipun solusi CONVERT lebih sederhana dan lebih mudah dibaca bagi sebagian orang, itu aku s lebih lambat. Tidak perlu untuk kembali ke datetime (ini secara implisit dilakukan oleh server). Juga tidak ada kebutuhan nyata dalam metode DateDiff untuk DateAdd setelah hasil integer juga secara implisit akan dikonversi kembali ke datetime.


SELECT CONVERT (varchar, MyDate, 101) DARI DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) DARI DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

Menggunakan FLOOR () sebagai @digi yang disarankan memiliki kinerja yang lebih dekat ke DateDiff, tetapi tidak disarankan karena casting tipe data datetime untuk mengapung dan kembali tidak selalu menghasilkan nilai asli.

Ingat teman-teman: Jangan percaya siapa pun. Lihatlah statistik kinerja, dan uji sendiri!

Hati-hati saat Anda menguji hasil Anda. Memilih banyak baris ke klien akan menyembunyikan perbedaan kinerja karena membutuhkan waktu lebih lama untuk mengirim baris melalui jaringan daripada melakukan perhitungan. Jadi pastikan bahwa pekerjaan untuk semua baris dilakukan oleh server tetapi tidak ada rowset yang dikirim ke klien.

Sepertinya ada kebingungan bagi sebagian orang tentang kapan optimisasi cache memengaruhi kueri. Menjalankan dua kueri dalam batch yang sama atau dalam batch terpisah tidak berpengaruh pada caching. Jadi, Anda dapat mengakhiri cache secara manual atau menjalankan kueri berulang kali beberapa kali. Pengoptimalan apa pun untuk kueri # 2 juga akan memengaruhi kueri berikutnya, jadi buang eksekusi # 1 jika Anda mau.

Disini adalah skrip uji lengkap dan hasil kinerja yang membuktikan DateDiff secara substansial lebih cepat daripada mengkonversi ke varchar.


67
2017-09-22 03:33



SELECT CONVERT(VARCHAR(10),GETDATE(),111)

41
2017-09-22 03:33



SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

35
2017-09-22 03:34



Anda dapat menggunakan CONVERT berfungsi untuk mengembalikan hanya tanggal. Lihat tautan di bawah ini:

Tanggal dan Waktu Manipulasi di SQL Server 2000

CAST dan CONVERT

Sintaks untuk menggunakan fungsi konversi adalah:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

18
2017-12-19 06:48



Untuk kembali dalam format tanggal 

CAST (tanggal OrderDate AS)

Kode di atas akan berfungsi di server sql 2010

Ini akan kembali seperti 12/12/2013

Untuk SQL Server 2012 gunakan kode di bawah ini

CONVERT(VARCHAR(10), OrderDate , 111)

17
2017-09-22 07:38