Jika Anda mencari untuk mendapatkan datatype tanggal tanpa waktu, bahkan jika waktu adalah 00:00:00 maka Anda kurang beruntung, Anda bisa mendapatkan varchar tetapi strukturnya adalah datetime dan Anda akan selalu punya waktu.
@Rohit Anda salah berasumsi bahwa 2008 adalah satu-satunya versi yang dipedulikan orang. (Ada lebih banyak versi di alam liar.) Suara itu berbicara sendiri.
hktegner
Jawaban:
2487
Pada SQL Server 2008dan lebih tinggi, Anda harus CONVERTberkencan:
SELECTCONVERT(date, getdate())
Pada versi yang lebih lama, Anda dapat melakukan hal berikut:
+1 Sepertinya yang ini 35% lebih cepat dari metode konversi ganda () yang biasa digunakan (yang juga saya gunakan selama bertahun-tahun). Bagus
Dane
8
Satu-satunya downside saya dapat melihat solusi Anda adalah bahwa kecuali Anda tahu apa yang dilakukannya itu agak tumpul. Menggunakan metode konversi ganda membuat niat Anda lebih jelas bagi pengelola kode masa depan. BTW saya belum menurunkan Anda. Saya pikir saya akan mulai menggunakan metode Anda juga. Terima kasih @aku
Jim Birchall
38
@pilavdzice Mengatur datetime hingga tengah malam pada hari itu MENINGGALKAN WAKTU. Apa hasil yang Anda harapkan? The datetimetipe data tidak dapat memiliki tidak ada waktu sama sekali . Saya pikir Anda membingungkan penyimpanan data dengan presentasi pengguna. Jika semua yang Anda inginkan adalah cara untuk menunjukkan kepada pengguna string yang tidak memiliki porsi waktu (bukan nol, hanya kosong) maka Anda hanya ingin Convert(varchar(30), @Date, 101)atau sesuatu yang serupa. Lihat SQL Server Books Online • Cast dan Konversi untuk info lebih lanjut.
ErikE
7
@ user1671639 tipe data datetime selalu berisi tanggal dan waktu, Anda tidak dapat menyimpan satu tanpa masuk akal - kecuali Anda menggunakan SQL Server 2008, dalam hal ini ada juga data 'tanggal' dan 'waktu' yang terpisah. jenis. Jika Anda menggunakan CONVERT () seperti itu, Anda benar-benar ingin string untuk digunakan nanti, jadi Anda akan terjebak melakukannya seperti itu - meskipun akan lebih baik jika Anda menggunakan fungsi format tanggal alih-alih memotong tanggal - atau melalui CAST(... AS DATE)atau CONVERT(DATE, ...), yang telah cukup sering disebutkan di halaman ini.
Magnus
10
Saya sarankan untuk mengubah jawaban SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)karena kemudian dddapat ditukar dengan datepartkata kunci lain untuk memotong Anda datetimedi tingkat sewenang-wenang.
Michael - Di mana Clay Shirky
717
SQLServer 2008 sekarang memiliki tipe data 'tanggal' yang hanya berisi tanggal tanpa komponen waktu. Siapa pun yang menggunakan SQLServer 2008 dan seterusnya dapat melakukan hal berikut:
Ada juga tipe data 'waktu' dalam SQL2008 yang menjawab setengah dari pertanyaan lain tentang pemisahan tanggal dan waktu.
misteraidan
8
FYI, saya membandingkan metode yang berbeda untuk mengurangi waktu dari tanggal dan ini adalah metode tercepat. Memang perbedaannya kecil, tapi itu jelas lebih cepat dari sejumlah besar eksekusi.
@FredrickGauss: Jenis apa, Tanggal? Versi SQL Server apa yang Anda gunakan?
abatishchev
7
Waspadalah! menyatakan @ date1 datetime = '2015-09-30 20: 59: 59.999'; pilih pemeran (@ date1 sebagai tanggal) mengembalikan '2015-10-01'
Nick
6
@Nick: ini adalah masalah dengan DateTime. gunakan DateTime2saja dan itu berfungsi dengan baik. sqlfiddle.com/#!6/9eecb7/2833
abatishchev
8
@Nick, untuk melengkapi respon abatishchev, @ date1 Anda memang 2015-10-01, karena DateTimeketerbatasan. Coba tanpa gips Date, itu menghasilkan 2015-10-01juga! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric
4
Salah satunya trik SQL yang mudah diingat. Seperti yang dikatakan Mike, hanya 2008 dan seterusnya, jika Anda menemukan DB 2005 dan sebelumnya di suatu tempat, Anda mungkin memiliki banyak masalah :)
NicVerAZ
73
DATEADD dan DATEIFF lebih baik daripada CONVERTing ke varchar. Kedua pertanyaan memiliki rencana eksekusi yang sama, tetapi rencana eksekusi terutama tentang strategi akses data 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 CPU Konversi!
Untuk melihat rencana eksekusi untuk kueri:
set showplan_text on
GO
Baik DATEADD dan DATEIFF akan menjalankan CONVERT_IMPLICIT.
Meskipun solusi CONVERT lebih sederhana dan lebih mudah dibaca untuk beberapa, itu adalah lambat. Tidak perlu dilemparkan kembali ke datetime (ini secara implisit dilakukan oleh server). Juga tidak ada kebutuhan nyata dalam metode DateDiff untuk DateAdd sesudahnya karena hasil integer juga akan secara implisit dikonversi kembali ke datetime.
SELECT CONVERT (varchar, MyDate, 101) DARI DatesTable
Menggunakan FLOOR () sebagai @digi yang disarankan memiliki kinerja yang lebih dekat dengan DateDiff, tetapi tidak direkomendasikan karena casting tipe data datetime ke float dan kembali tidak selalu menghasilkan nilai asli.
Ingat teman-teman: Jangan percaya siapa pun. Lihatlah statistik kinerja, dan uji sendiri!
Berhati-hatilah saat menguji hasil Anda. Memilih banyak baris ke klien akan menyembunyikan perbedaan kinerja karena butuh 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.
Tampaknya ada kebingungan bagi sebagian orang tentang kapan optimasi cache mempengaruhi permintaan. Menjalankan dua kueri dalam batch yang sama atau dalam batch terpisah tidak berpengaruh pada caching. Jadi, Anda dapat kedaluwarsa cache secara manual atau cukup jalankan kueri bolak-balik beberapa kali. Optimasi apa pun untuk kueri # 2 juga akan memengaruhi kueri berikutnya, jadi buang eksekusi # 1 jika mau.
Ricardo C, investigasi yang bagus! Versi SQL server apa yang Anda gunakan? Pada metode MSSQL2000 dengan Dateiff melakukan sedikit lebih cepat untuk saya.
aku
Sekadar diketahui, saya melakukan tes 1000.000 kali. Untuk perbedaan kinerja skenario dunia nyata tidak akan terlihat, saya kira
aku
Aku, saya menggunakan SQL Server 2005 Express untuk tes ini. Saya mengerjakan 2000 di tempat kerja, dan saya akan mengujinya dengan meja dengan lebih dari 24 juta baris dan melihat apa yang dihasilkannya.
Ricardo C
Aku, hasil yang sama. Tidak ada perbedaan dalam kinerja lebih dari sepuluh juta baris.
Ricardo C
5
Klaim tentang kinerja yang sama tidak benar. Tentu saja rencana eksekusi akan sama !!! Mengukur kinerja pada HARUS dilakukan dengan membandingkan penggunaan CPU, bukan memeriksa rencana eksekusi.
ErikE
51
Coba ini:
SELECTCONVERT(VARCHAR(10),GETDATE(),111)
Pernyataan di atas mengubah format Anda saat ini menjadi YYYY/MM/DD, silakan merujuk ke tautan ini untuk memilih format yang Anda inginkan.
Metode ini bukan yang tercepat, dan juga secara implisit mengajarkan kepada orang-orang bahwa casting tanggal untuk mengapung adalah akurat, padahal sebenarnya tidak. Silakan lihat posting ini untuk lebih detail.
ErikE
13
Jika Anda menggunakan SQL Server 2012 atau versi di atas ,
Sudah ada beberapa jawaban dan tipe format untuk SQL server. Tetapi sebagian besar metode agak ambigu dan akan sulit bagi Anda untuk mengingat angka untuk jenis format atau fungsi sehubungan dengan Format Tanggal Khusus. Itu sebabnya di versi SQL server berikutnya ada opsi yang lebih baik.
FORMAT ( value, format [, culture ])
Opsi kultur sangat berguna, karena Anda dapat menentukan tanggal sesuai pemirsa Anda.
Anda harus mengingat d (untuk pola kecil) dan D (untuk pola panjang).
2009-06-15T13:45:30-> Monday, June 15,2009(en-US)2009-06-15T13:45:30->15июня2009г.(ru-RU)2009-06-15T13:45:30-> Montag,15. Juni 2009(de-DE)
Lebih banyak contoh dalam kueri.
DECLARE@d DATETIME ='10/01/2011';SELECT FORMAT (@d,'d','en-US')AS'US English Result',FORMAT (@d,'d','en-gb')AS'Great Britain English Result',FORMAT (@d,'d','de-de')AS'German Result',FORMAT (@d,'d','zh-cn')AS'Simplified Chinese (PRC) Result';SELECT FORMAT (@d,'D','en-US')AS'US English Result',FORMAT (@d,'D','en-gb')AS'Great Britain English Result',FORMAT (@d,'D','de-de')AS'German Result',FORMAT (@d,'D','zh-cn')AS'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------10/1/201101/10/201101.10.20112011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01,201101 October 2011 Samstag,1. Oktober 20112011年10月1日
Jika Anda menginginkan lebih banyak format, Anda dapat mengunjungi:
JIKA Anda ingin menggunakan CONVERT dan mendapatkan output yang sama seperti pada pertanyaan asli yang diajukan, yaitu, yyyy-mm-dd kemudian menggunakan CONVERT(varchar(10),[SourceDate as dateTime],121)kode yang sama dengan jawaban pasangan sebelumnya, tetapi kode untuk mengkonversi ke yyyy-mm-dd dengan tanda hubung adalah 121.
Jika saya bisa menggunakan kotak sabun saya sebentar, format seperti ini tidak termasuk dalam tingkat data , dan itulah mengapa itu tidak mungkin tanpa 'trik' overhead konyol sampai SQL Server 2008 ketika tipe data bagian data aktual adalah diperkenalkan. Membuat konversi semacam itu di tingkat data adalah pemborosan besar pada DBMS Anda, tetapi yang lebih penting, begitu Anda melakukan sesuatu seperti ini, pada dasarnya Anda telah membuat data yatim dalam memori yang saya anggap Anda akan kembali ke program. Anda tidak dapat memasukkannya kembali ke kolom 3NF + lainnya atau membandingkannya dengan apa pun yang diketik tanpa kembali, sehingga semua yang Anda lakukan adalah memasukkan poin kegagalan dan menghapus referensi relasional.
Anda harus SELALU maju dan mengembalikan tipe data dateTime Anda ke program panggilan dan di tingkat PRESENTASI, buat penyesuaian apa pun yang diperlukan. Segera setelah Anda mengonversi beberapa hal sebelum mengembalikannya ke pemanggil, Anda menghapus semua harapan integritas referensial dari aplikasi. Ini akan mencegah operasi UPDATE atau DELETE, sekali lagi, kecuali jika Anda melakukan semacam pembalikan manual, yang sekali lagi mengekspos data Anda ke kesalahan manusia / kode / gremlin ketika tidak diperlukan.
Kecuali, katakanlah, jika Anda ingin kueri yang mengambil semua catatan yang cocok dengan tanggal yang diberikan pengguna sebagai bagian-tanggal dari bidang waktu tertentu. Selamat mencoba melakukan itu hanya di lapisan presentasi. (Anda tidak perlu mengkonversi, Anda dapat menggunakan aritmatika tanggal, tetapi Anda mendapatkan idenya ...)
Andrew Lazarus
1
@ Andrew mengapa ini penting? Anda berkata WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- sama sekali tidak ada alasan untuk menghapus waktu dari kolom.
Aaron Bertrand
1
@ AaronBertrand Itu hanya berfungsi dengan asumsi input @Datememiliki bagian waktu nol. Jika itu tidak benar, Anda masih perlu tahu cara memotong sisi server. Saya setuju dengan jawaban ini bahwa pemformatan harus diserahkan ke lapisan presentasi, tetapi saya tidak setuju dengan implikasi bahwa meninggalkan itu untuk ujung depan berarti Anda tidak perlu tahu cara cepat untuk memotong.
Andrew Lazarus
1
@Andrew yang harus Anda lakukan adalah membuat parameter input DATE. Maksud saya tetap bahwa Anda tidak harus menerapkan pemotongan seperti itu ke kolom , meskipun itu adalah insting pertama kebanyakan orang.
Aaron Bertrand
1
@ AaronBertrand dan itu mengasumsikan Anda memiliki kontrol atas tipe data dari parameter. Baik dalam prosedur tersimpan, tidak mungkin dilakukan dalam situasi lain. Mengapa tidak memilih untuk memastikan parameter adalah tipe yang Anda inginkan dan butuhkan?
Metode-metode ini sangat bagus, tetapi mana yang Anda sarankan untuk digunakan?
eddiegroves
3
Perhatikan bahwa versi "benar" dari dua teratas adalah select dateadd(dd, datediff(dd, 0, getdate()), 0), karena dds kemudian dapat ditukar dengan datepartkata kunci mana saja untuk memotong tanggal pada segmen mana pun yang Anda pilih. (Perhatikan juga bahwa itu ddadalah singkatan untuk day.)
Michael - Where's Clay Shirky
10
Untuk mendapatkan hasil yang ditunjukkan, saya menggunakan perintah berikut.
Contoh pertama Anda masih memiliki komponen waktu. Inti pertanyaannya adalah bagaimana menghapusnya.
Zack
5
Bahkan menggunakan MSSQL Server 7.0 kuno, kode di sini (milik tautan ini ) memungkinkan saya untuk mendapatkan format tanggal apa pun yang saya cari pada saat itu:
PRINT'1) Date/time in format MON DD YYYY HH:MI AM (OR PM): '+CONVERT(CHAR(19),GETDATE())PRINT'2) Date/time in format MM-DD-YY: '+CONVERT(CHAR(8),GETDATE(),10)PRINT'3) Date/time in format MM-DD-YYYY: '+CONVERT(CHAR(10),GETDATE(),110)PRINT'4) Date/time in format DD MON YYYY: '+CONVERT(CHAR(11),GETDATE(),106)PRINT'5) Date/time in format DD MON YY: '+CONVERT(CHAR(9),GETDATE(),6)PRINT'6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): '+CONVERT(CHAR(24),GETDATE(),113)
Ini menghasilkan output ini:
1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 2720151:14PM
2) Date/time in format MM-DD-YY:02-27-153) Date/time in format MM-DD-YYYY:02-27-20154) Date/time in format DD MON YYYY:27 Feb 20155) Date/time in format DD MON YY:27 Feb 156) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H):27 Feb 201513:14:46:630
select {fn current_date()} as todaybekerja untukku.
brianary
@ Brianary - Itu bagus, tapi itu bukan ANSI SQL.
menyala
Itu cukup adil, dan jawaban Anda mudah dibawa-bawa, tapi saya pikir selama kami mengerjakan T-SQL, ini juga berfungsi (dan menunjukkan bahwa menerapkan ANSI CURRENT_DATE akan sepele untuk MS).
brianary
4
Saya menyukai hal-hal berikut yang tidak disebutkan:
Itu juga tidak peduli tentang lokal atau melakukan konversi ganda - meskipun setiap 'bagian data' mungkin melakukan matematika. Jadi mungkin sedikit lebih lambat daripada metode tanggal, tetapi bagi saya itu jauh lebih jelas. Terutama ketika saya ingin mengelompokkan berdasarkan tahun dan bulan (atur hari ke 1).
Anda dapat menggunakan berikut ini untuk bagian tanggal dan memformat tanggal:
DATENAME => Mengembalikan string karakter yang mewakili bagian data yang ditentukan dari tanggal yang ditentukan
DATEADD => DATEPART()Fungsi ini digunakan untuk mengembalikan satu bagian dari tanggal / waktu, seperti tahun, bulan, hari, jam, menit, dll.
DATEPART => Mengembalikan integer yang mewakili bagian data yang ditentukan dari tanggal yang ditentukan.
CONVERT()=> CONVERT()Fungsi adalah fungsi umum yang mengubah ekspresi dari satu tipe data ke yang lain. The
CONVERT()fungsi dapat digunakan untuk menampilkan data tanggal / waktu dalam format yang berbeda.
Jawaban:
Pada
SQL Server 2008
dan lebih tinggi, Anda harusCONVERT
berkencan:Pada versi yang lebih lama, Anda dapat melakukan hal berikut:
sebagai contoh
memberi saya
Pro:
varchar
<->datetime
locale
Seperti yang disarankan oleh Michael
Gunakan varian ini:
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Keluaran:
sumber
datetime
tipe data tidak dapat memiliki tidak ada waktu sama sekali . Saya pikir Anda membingungkan penyimpanan data dengan presentasi pengguna. Jika semua yang Anda inginkan adalah cara untuk menunjukkan kepada pengguna string yang tidak memiliki porsi waktu (bukan nol, hanya kosong) maka Anda hanya inginConvert(varchar(30), @Date, 101)
atau sesuatu yang serupa. Lihat SQL Server Books Online • Cast dan Konversi untuk info lebih lanjut.CAST(... AS DATE)
atauCONVERT(DATE, ...)
, yang telah cukup sering disebutkan di halaman ini.SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
karena kemudiandd
dapat ditukar dengandatepart
kata kunci lain untuk memotong Andadatetime
di tingkat sewenang-wenang.SQLServer 2008 sekarang memiliki tipe data 'tanggal' yang hanya berisi tanggal tanpa komponen waktu. Siapa pun yang menggunakan SQLServer 2008 dan seterusnya dapat melakukan hal berikut:
sumber
Jika menggunakan SQL 2008 dan di atasnya:
sumber
DateTime2
saja dan itu berfungsi dengan baik. sqlfiddle.com/#!6/9eecb7/28332015-10-01
, karenaDateTime
keterbatasan. Coba tanpa gipsDate
, itu menghasilkan2015-10-01
juga!declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=>2015-10-01
DATEADD dan DATEIFF lebih baik daripada CONVERTing ke varchar. Kedua pertanyaan memiliki rencana eksekusi yang sama, tetapi rencana eksekusi terutama tentang strategi akses data 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 CPU Konversi!
Untuk melihat rencana eksekusi untuk kueri:
Baik DATEADD dan DATEIFF akan menjalankan CONVERT_IMPLICIT.
Meskipun solusi CONVERT lebih sederhana dan lebih mudah dibaca untuk beberapa, itu adalah lambat. Tidak perlu dilemparkan kembali ke datetime (ini secara implisit dilakukan oleh server). Juga tidak ada kebutuhan nyata dalam metode DateDiff untuk DateAdd sesudahnya karena hasil integer juga akan secara implisit dikonversi kembali ke datetime.
SELECT CONVERT (varchar, MyDate, 101) DARI DatesTable
SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) DARI DatesTable
Menggunakan FLOOR () sebagai @digi yang disarankan memiliki kinerja yang lebih dekat dengan DateDiff, tetapi tidak direkomendasikan karena casting tipe data datetime ke float dan kembali tidak selalu menghasilkan nilai asli.
Ingat teman-teman: Jangan percaya siapa pun. Lihatlah statistik kinerja, dan uji sendiri!
Berhati-hatilah saat menguji hasil Anda. Memilih banyak baris ke klien akan menyembunyikan perbedaan kinerja karena butuh 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.
Tampaknya ada kebingungan bagi sebagian orang tentang kapan optimasi cache mempengaruhi permintaan. Menjalankan dua kueri dalam batch yang sama atau dalam batch terpisah tidak berpengaruh pada caching. Jadi, Anda dapat kedaluwarsa cache secara manual atau cukup jalankan kueri bolak-balik beberapa kali. Optimasi apa pun untuk kueri # 2 juga akan memengaruhi kueri berikutnya, jadi buang eksekusi # 1 jika mau.
Berikut ini adalah skrip pengujian lengkap dan hasil kinerja yang membuktikan DateDiff secara substansial lebih cepat daripada mengonversi ke varchar.
sumber
Coba ini:
Pernyataan di atas mengubah format Anda saat ini menjadi
YYYY/MM/DD
, silakan merujuk ke tautan ini untuk memilih format yang Anda inginkan.sumber
mm/dd/yyyy
format.sumber
Untuk format tanggal kembali
Kode di atas akan berfungsi di sql server 2010
Ini akan kembali seperti 12/12/2013
Untuk SQL Server 2012 gunakan kode di bawah ini
sumber
Anda dapat menggunakan
CONVERT
fungsi ini hanya untuk mengembalikan tanggal. Lihat tautan di bawah:Manipulasi Tanggal dan Waktu di SQL Server 2000
CAST dan CONVERT
Sintaks untuk menggunakan fungsi konversi adalah:
sumber
Jika Anda membutuhkan hasilnya sebagai
varchar
, Anda harus melaluiyang sudah disebutkan di atas.
Jika Anda memerlukan hasil dalam format tanggal dan waktu, Anda harus menggunakan salah satu pertanyaan di bawah ini
sumber
sumber
Menggunakan FLOOR () - cukup potong bagian waktu.
sumber
Jika Anda menggunakan SQL Server 2012 atau versi di atas ,
Gunakan
Format()
fungsi.Sudah ada beberapa jawaban dan tipe format untuk SQL server. Tetapi sebagian besar metode agak ambigu dan akan sulit bagi Anda untuk mengingat angka untuk jenis format atau fungsi sehubungan dengan Format Tanggal Khusus. Itu sebabnya di versi SQL server berikutnya ada opsi yang lebih baik.
Opsi kultur sangat berguna, karena Anda dapat menentukan tanggal sesuai pemirsa Anda.
Anda harus mengingat d (untuk pola kecil) dan D (untuk pola panjang).
1. "d" - pola tanggal pendek.
2. "D" - pola tanggal panjang.
Lebih banyak contoh dalam kueri.
Jika Anda menginginkan lebih banyak format, Anda dapat mengunjungi:
sumber
JIKA Anda ingin menggunakan CONVERT dan mendapatkan output yang sama seperti pada pertanyaan asli yang diajukan, yaitu, yyyy-mm-dd kemudian menggunakan
CONVERT(varchar(10),[SourceDate as dateTime],121)
kode yang sama dengan jawaban pasangan sebelumnya, tetapi kode untuk mengkonversi ke yyyy-mm-dd dengan tanda hubung adalah 121.Jika saya bisa menggunakan kotak sabun saya sebentar, format seperti ini tidak termasuk dalam tingkat data , dan itulah mengapa itu tidak mungkin tanpa 'trik' overhead konyol sampai SQL Server 2008 ketika tipe data bagian data aktual adalah diperkenalkan. Membuat konversi semacam itu di tingkat data adalah pemborosan besar pada DBMS Anda, tetapi yang lebih penting, begitu Anda melakukan sesuatu seperti ini, pada dasarnya Anda telah membuat data yatim dalam memori yang saya anggap Anda akan kembali ke program. Anda tidak dapat memasukkannya kembali ke kolom 3NF + lainnya atau membandingkannya dengan apa pun yang diketik tanpa kembali, sehingga semua yang Anda lakukan adalah memasukkan poin kegagalan dan menghapus referensi relasional.
Anda harus SELALU maju dan mengembalikan tipe data dateTime Anda ke program panggilan dan di tingkat PRESENTASI, buat penyesuaian apa pun yang diperlukan. Segera setelah Anda mengonversi beberapa hal sebelum mengembalikannya ke pemanggil, Anda menghapus semua harapan integritas referensial dari aplikasi. Ini akan mencegah operasi UPDATE atau DELETE, sekali lagi, kecuali jika Anda melakukan semacam pembalikan manual, yang sekali lagi mengekspos data Anda ke kesalahan manusia / kode / gremlin ketika tidak diperlukan.
sumber
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- sama sekali tidak ada alasan untuk menghapus waktu dari kolom.@Date
memiliki bagian waktu nol. Jika itu tidak benar, Anda masih perlu tahu cara memotong sisi server. Saya setuju dengan jawaban ini bahwa pemformatan harus diserahkan ke lapisan presentasi, tetapi saya tidak setuju dengan implikasi bahwa meninggalkan itu untuk ujung depan berarti Anda tidak perlu tahu cara cepat untuk memotong.Sunting: Dua metode pertama pada dasarnya sama, dan melakukan konversi ke metode varchar.
sumber
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, karenadd
s kemudian dapat ditukar dengandatepart
kata kunci mana saja untuk memotong tanggal pada segmen mana pun yang Anda pilih. (Perhatikan juga bahwa itudd
adalah singkatan untukday
.)Untuk mendapatkan hasil yang ditunjukkan, saya menggunakan perintah berikut.
Saya sangat berguna.
sumber
sumber
Jika Anda menetapkan hasil ke kolom atau variabel, berikan tipe DATE, dan konversi tersirat.
sumber
Saya pikir ini akan berhasil dalam kasus Anda:
sumber
sumber
Oke, Meskipun saya agak terlambat :), Ini solusi lain.
Hasil
Dan jika Anda menggunakan SQL Server 2012 dan lebih tinggi maka Anda dapat menggunakan
FORMAT()
fungsi seperti ini -sumber
Bahkan menggunakan MSSQL Server 7.0 kuno, kode di sini (milik tautan ini ) memungkinkan saya untuk mendapatkan format tanggal apa pun yang saya cari pada saat itu:
Ini menghasilkan output ini:
sumber
Tanggal:
Waktu:
sumber
Cukup Anda bisa melakukan ini:
Output sebagai:
Atau cukup lakukan ini:
Hasil:
sumber
mengapa Anda tidak menggunakan DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?
EX:
select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
Anda dapat mengubah urutan m, d, dan tahun dengan mengatur ulang
'%d-%m-%Y'
bagiansumber
Saya tahu ini sudah tua, tapi saya tidak melihat di mana ada yang menyatakan seperti ini. Dari apa yang saya tahu, ini adalah standar ANSI.
Akan lebih baik jika Microsoft juga dapat mendukung variabel CURRENT_DATE standar ANSI.
sumber
select {fn current_date()} as today
bekerja untukku.Saya menyukai hal-hal berikut yang tidak disebutkan:
Itu juga tidak peduli tentang lokal atau melakukan konversi ganda - meskipun setiap 'bagian data' mungkin melakukan matematika. Jadi mungkin sedikit lebih lambat daripada metode tanggal, tetapi bagi saya itu jauh lebih jelas. Terutama ketika saya ingin mengelompokkan berdasarkan tahun dan bulan (atur hari ke 1).
sumber
Mulai dari SQL SERVER 2012, Anda dapat melakukan ini:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
sumber
Pada SQL Server 2000
sumber
Dalam hal ini, hanya tanggal, Anda kami akan menjalankan kueri ini:
SELECT CONVERT (VARCHAR (10), getdate (), 111);
sumber
Anda dapat menggunakan berikut ini untuk bagian tanggal dan memformat tanggal:
DATENAME => Mengembalikan string karakter yang mewakili bagian data yang ditentukan dari tanggal yang ditentukan
DATEADD =>
DATEPART()
Fungsi ini digunakan untuk mengembalikan satu bagian dari tanggal / waktu, seperti tahun, bulan, hari, jam, menit, dll.DATEPART => Mengembalikan integer yang mewakili bagian data yang ditentukan dari tanggal yang ditentukan.
CONVERT()
=>CONVERT()
Fungsi adalah fungsi umum yang mengubah ekspresi dari satu tipe data ke yang lain. TheCONVERT()
fungsi dapat digunakan untuk menampilkan data tanggal / waktu dalam format yang berbeda.sumber