Bandingkan tanggal string datetime di SQL Server?

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>&#39;20080813&#39; DAN tanggal<&#39;20080815&#39;) 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.)

Larutan

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.

Komentar (3)

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:

Komentar (0)

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)
Komentar (0)

Sesuatu seperti ini?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'
Komentar (0)

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.

Komentar (0)

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
Komentar (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
Komentar (1)

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))
Komentar (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
Komentar (1)

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'
Komentar (0)
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

Komentar (0)
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat
Komentar (0)

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)
Komentar (0)

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
Komentar (0)
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
Komentar (0)
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
Komentar (0)

Cara terbaik adalah untuk hanya mengambil bagian tanggal menggunakan SQL DATE() Fungsi:

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
Komentar (0)

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();

Komentar (0)