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?
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?
Jawaban:
Pada SQL Server 2008
dan lebih tinggi, Anda harus CONVERT
berkencan:
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:
varchar
<->datetime
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
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 ingin Convert(varchar(30), @Date, 101)
atau sesuatu yang serupa. Lihat SQL Server Books Online • Cast dan Konversi untuk info lebih lanjut.
CAST(... AS DATE)
atau CONVERT(DATE, ...)
, yang telah cukup sering disebutkan di halaman ini.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
karena kemudian dd
dapat ditukar dengan datepart
kata kunci lain untuk memotong Anda datetime
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:
SELECT CONVERT(date, GETDATE())
Jika menggunakan SQL 2008 dan di atasnya:
select cast(getdate() as date)
DateTime2
saja dan itu berfungsi dengan baik. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
, karena DateTime
keterbatasan. Coba tanpa gips Date
, itu menghasilkan 2015-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:
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.
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.
mm/dd/yyyy
format.
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)
Anda dapat menggunakan CONVERT
fungsi ini hanya untuk mengembalikan tanggal. Lihat tautan di bawah:
Manipulasi Tanggal dan Waktu di SQL Server 2000
Sintaks untuk menggunakan fungsi konversi adalah:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00: 00: 00.000
Menggunakan FLOOR () - cukup potong bagian waktu.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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).
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)
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 2011年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.
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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, karena dd
s kemudian dapat ditukar dengan datepart
kata kunci mana saja untuk memotong tanggal pada segmen mana pun yang Anda pilih. (Perhatikan juga bahwa itu dd
adalah singkatan untuk day
.)
Untuk mendapatkan hasil yang ditunjukkan, saya menggunakan perintah berikut.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Saya sangat berguna.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Jika Anda menetapkan hasil ke kolom atau variabel, berikan tipe DATE, dan konversi tersirat.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Saya pikir ini akan berhasil dalam kasus Anda:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
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')
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
Tanggal:
SELECT CONVERT (tanggal, MENDAPATKAN ()) SELECT CAST (GETDATE () sebagai tanggal)
Waktu:
SELECT CONVERT (waktu, MENDAPATKAN (), 114) SELECT CAST (GETDATE () sebagai waktu)
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
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
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.
select {fn current_date()} as today
bekerja untukku.
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).
Dalam hal ini, hanya tanggal, Anda kami akan menjalankan kueri ini:
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.