Cara mengembalikan hanya Date dari tipe data DateTime SQL Server

1778
SELECT GETDATE()

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

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

Bagaimana saya bisa mendapatkannya?

eddiegroves
sumber
4
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.
Quintin Robinson
16
Satu hal yang perlu diperhatikan adalah bahwa SQL Server 2008 menyertakan datatype DATE terpisah untuk menyimpan tanggal hanya tanpa komponen waktu. Info lebih lanjut di sini: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein
7
Jangan lewatkan pos ini yang menampilkan hasil pengujian kinerja dari berbagai metode penghilangan waktu.
ErikE
18
Jangan disesatkan oleh suara dan jawaban yang diterima, Lihatlah stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews
8
@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:

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

Pro:

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

Seperti yang disarankan oleh Michael

Gunakan varian ini: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

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

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Keluaran:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
aku
sumber
52
+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:

SELECT CONVERT(date, GETDATE())
BenR
sumber
41
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.
UnhandledExcepSean
2
tentang sqlserver 2005 ??
Dr. MAF
@ Dr.MAF Menyelesaikan lingkaran, jawaban sebelum 2008 ada di sini: stackoverflow.com/questions/113045/…
Frosty840
170

Jika menggunakan SQL 2008 dan di atasnya:

select cast(getdate() as date)
abatishchev
sumber
3
@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

  |--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 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.

Ricardo C
sumber
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:

SELECT CONVERT(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.

Nescio
sumber
5
Ini mengembalikan '2008/09/22' untuk saya
eddiegroves
1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) adalah mm/dd/yyyyformat.
Kutu
4
jika Anda mengurutkan berdasarkan nilai teks mentah (di luar DB) maka format 'Jepang' lebih baik
Simon_Weaver
40
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Cade Roux
sumber
21

Untuk format tanggal kembali

CAST (tanggal AS Tanggal Pemesanan)

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

CONVERT(VARCHAR(10), OrderDate , 111)
Mahesh ML
sumber
1
Ini mengembalikan saya berkencan dengan nol waktu, bukan hanya kencan
Bohemian
1
dapatkah saya mengetahui versi mana jika sql server yang Anda gunakan?
Mahesh ML
1
@ MaheshML mengembalikan tanggal dan waktu dalam MS SQL 2012.
Marek
1
Bekerja seperti pesona di SQL Azure
Martín Coll
5
@ MaheshML Tidak ada yang namanya SQL Server 2010.
SvenAelterman
16

Jika Anda membutuhkan hasilnya sebagai varchar, Anda harus melalui

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

yang sudah disebutkan di atas.

Jika Anda memerlukan hasil dalam format tanggal dan waktu, Anda harus menggunakan salah satu pertanyaan di bawah ini

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate

    2014-03-26 00: 00: 00.000

Stephon Johns
sumber
14
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
Rushda
sumber
13

Menggunakan FLOOR () - cukup potong bagian waktu.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DiGi
sumber
4
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 ,

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.

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).

1. "d" - pola tanggal pendek.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - pola tanggal 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/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011101

Jika Anda menginginkan lebih banyak format, Anda dapat mengunjungi:

  1. String Format Tanggal dan Waktu Standar
  2. String Format Tanggal dan Waktu Kustom
Somnath Muluk
sumber
12

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.

Focusyn
sumber
1
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?
Andrew Lazarus
10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Sunting: Dua metode pertama pada dasarnya sama, dan melakukan konversi ke metode varchar.

Gordon Bell
sumber
1
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.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Saya sangat berguna.

Anderson Silva
sumber
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
Ankit Khetan
sumber
7

Jika Anda menetapkan hasil ke kolom atau variabel, berikan tipe DATE, dan konversi tersirat.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Seni Schmidt
sumber
6

Saya pikir ini akan berhasil dalam kasus Anda:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
bishnu karki
sumber
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
etni
sumber
2
Saran ini telah dicakup oleh jawaban lain (lebih dari sekali).
Andriy M
6

Oke, Meskipun saya agak terlambat :), Ini solusi lain.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Hasil

2008-09-22 00:00:00.000

Dan jika Anda menggunakan SQL Server 2012 dan lebih tinggi maka Anda dapat menggunakan FORMAT()fungsi seperti ini -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Krishnraj Rana
sumber
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 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
tumultous_rooster
sumber
5

Tanggal:

SELECT CONVERT (tanggal, MENDAPATKAN ())
SELECT CAST (GETDATE () sebagai tanggal)

Waktu:

SELECT CONVERT (waktu, MENDAPATKAN (), 114)
SELECT CAST (GETDATE () sebagai waktu)
Kris Khairallah
sumber
5

Cukup Anda bisa melakukan ini:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Output sebagai:

2008-09-22 00:00:00.000

Atau cukup lakukan ini:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Hasil:

Date Part Only
--------------
2013-07-14
Amar Srivastava
sumber
4

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'bagian

Janaka R Rajapaksha
sumber
4

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.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Akan lebih baik jika Microsoft juga dapat mendukung variabel CURRENT_DATE standar ANSI.

menyala
sumber
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:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

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).

Gerard ONeill
sumber
4

Mulai dari SQL SERVER 2012, Anda dapat melakukan ini:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

xbb
sumber
4

Pada SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
kaub0st3r
sumber
4

Dalam hal ini, hanya tanggal, Anda kami akan menjalankan kueri ini:

SELECT CONVERT (VARCHAR (10), getdate (), 111);masukkan deskripsi gambar di sini

Mohammad Neamul Islam
sumber
Ini harus menjadi jawaban yang diterima.
noobprogrammer
3

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.

pengguna1151326
sumber