Di SQL Server saya memiliki DATETIME
kolom yang mencakup elemen waktu.
Contoh:
'14 AUG 2008 14:23:019'
Apa terbaik metode untuk hanya pilih catatan untuk hari tertentu, mengabaikan waktu paruh?
Contoh: (Tidak aman, karena tidak sesuai dengan waktu paruh dan kembali tidak ada baris)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
Catatan: Mengingat situs ini juga mencatat catatan dan teknik yang anda mengambil dan kemudian lupa, aku'm akan posting saya sendiri jawaban untuk pertanyaan ini sebagai DATETIME hal-hal di MSSQL mungkin adalah topik yang saya lookup paling di SQLBOL.
Update Menjelaskan contoh untuk lebih spesifik.
Edit Maaf, Tapi aku've telah ke bawah-mod jawaban yang SALAH (jawaban bahwa hasil yang salah).
@Jorrit: MANA (tanggal>'20080813' DAN tanggal<'20080815')
akan kembali ke-13 dan ke-14.
@wearejimbo: Dekat, tapi tidak ada cerutu! lencana penghargaan yang diberikan kepada anda. Anda tidak terjawab catatan-catatan tertulis di 14/08/2008 23:59:001-23:59:999 (yaitu Kurang dari 1 detik sebelum tengah malam.)
Teknik 1:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)
Keuntungan dari ini adalah bahwa hal itu akan menggunakan indeks pada 'column_datetime' jika ada.
Di SQL Server 2008, anda bisa menggunakan datatype DATE
DECLARE @pDate DATE='2008-08-14'
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate
@Orang. Saya pikir anda akan menemukan bahwa ini solusi timbangan baik-baik saja. Silahkan lihat di rencana eksekusi query asli query.
Dan untuk tambang:
Coba bandingkan dengan tahun, bulan dan hari nilai-nilai.
Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'
SELECT *
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
AND Month(column_datetime) = Month(@DateToSearch)
AND Day(column_datetime) = Day(@DateToSearch)
Teknik 2:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
Jika column_datetime lapangan tidak diindeks, dan adalah tidak mungkin (atau indeks ini tidak mungkin untuk digunakan) kemudian menggunakan DATEDIFF() yang lebih pendek.
Saya biasanya mengkonversi tanggal-waktu untuk upload dan membandingkan mereka, seperti ini:
SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)
atau
SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
Titik yang baik tentang indeks dalam jawaban anda diterima.
Namun, jika anda benar-benar mencari hanya pada spesifik TANGGAL
atau rentang TANGGAL
sering, maka solusi terbaik yang saya temukan adalah untuk menambah bertahan dihitung kolom tabel yang hanya akan berisi TANGGAL
, dan menambahkan indeks pada kolom ini:
ALTER TABLE "table1"
ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED
Menambahkan indeks pada kolom tersebut:
CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON "table1" ( "column_date" ASC )
GO
Maka pencarian anda akan lebih cepat:
DECLARE @p_date DATE
SET @p_date = CONVERT( DATE, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_date = @p_date
Cara untuk mendapatkan bagian TANGGAL DATETIME lapangan di MS SQL Server:
Salah satu cara tercepat dan rapi cara untuk melakukan ini adalah dengan menggunakan
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
Menghindari CPU penghilang "mengubah tanggal menjadi string tanpa waktu dan kemudian mengubahnya kembali lagi" logika.
Hal ini juga tidak mengekspos implementasi internal bahwa "porsi waktu dinyatakan sebagai fraksi" tanggal.
Dapatkan tanggal hari pertama dari bulan
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
Dapatkan tanggal rfom 1 tahun yang lalu
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
Fungsi ini Cor(Lantai(Cast(GetDate() Sebagai Float)) Sebagai DateTime) kembali datetime datatype dengan porsi waktu dihapus dan dapat digunakan sebagai begitu.
Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'
atau
DECLARE @p_date DATETIME
SET @p_date = Cast('14 AUG 2008' as DateTime)
SELECT *
FROM table1
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date
Aku tahu ini isn't persis bagaimana anda ingin melakukan ini, tapi ini bisa menjadi awal:
SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year,
DATEPART(mm, column_dateTime) as Month,
DATEPART(dd, column_dateTime) as Day
FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Ini akan mengkonversi datatime dan string ke varchars format "YYYY-MM-DD".
Ini adalah sangat jelek, tapi harus kerja
Upload dapat dibandingkan di sqlserver menggunakan string sebagai perbandingan: misalnya
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
Ada banyak format tanggal di SQL yang sedang ditentukan. Lihat https://msdn.microsoft.com/en-in/library/ms187928.aspx
Mengkonversi dan membandingkan varchar kolom dengan tanggal-tanggal tertentu.
Sintaks:
SELECT * FROM tablename where CONVERT(datetime,columnname,103)
between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
Di sqlserver
DECLARE @p_date DATE
SELECT *
FROM table1
WHERE column_dateTime=@p_date
Dalam C# Lulus string pendek dari nilai tanggal dengan menggunakan ToShortDateString() fungsi. contoh: DateVariable.ToShortDateString();