Comparați un șir de date cu datetime în SQL Server?

În SQL Server am o coloană DATETIME care include un element de timp.

Exemplu:

'14 AUG 2008 14:23:019'

Care este metoda best pentru a selecta numai înregistrările pentru o anumită zi, ignorând partea de timp?

Exemplu: (Nu este sigur, deoarece nu se potrivește cu partea de timp și nu returnează rânduri)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Notă: Având în vedere că acest site este, de asemenea, despre jotting note și tehnici pe care le ridicați și apoi uitați, voi posta propriul meu răspuns la această întrebare ca chestii DATETIME în MSSQL este probabil subiectul căut cel mai mult în SQLBOL.


Update Clarified example to be more specific.


Edit Sorry, But I've had to down-mod WRONG answers (answers that return wrong results).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') will return the 13th and the 14th.

@wearejimbo: Închideți, dar nu trageți insigna acordată dvs. Ați pierdut înregistrările scrise la 14/08/2008 23: 59: 001 până la 23: 59: 999 (adică mai puțin de o secundă înainte de miezul nopții.)

0
fr hi bn

18 răspunsuri

În SQL Server 2008, puteți utiliza noul DATE datatype

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@Tip. Cred că veți găsi că această soluție se măsoară foarte bine. Priviți planul de executare a interogării al originalului interogare.

Și pentru a mea :

0
adăugat

Doar comparați valorile anului, lunii și zilei.

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)
0
adăugat

Știu că nu este exact cum doriți să faceți acest lucru, dar ar putea fi un început:

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'
0
adăugat

Această funcție Distribuție (Etajul (Distribuție (GetDate() ca Float)) ca DateTime) returnează un dattype datetime cu psauțiunea de timp eliminată și ar putea fi utilizată ca atare.

Select
*
Table1
Where
Cast(Flosau(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

sau

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Flosau(Cast(column_datetime As Float)) As DateTime) = @p_date
0
adăugat
Nu vor fi multiple funcții aplicate câmpului (dacă sunt indexate) convertește acest lucru într-o scanare de masă completă?
adăugat autor Manuel Ferreria, sursa
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

Aceasta va converti timpul de date și șirul în varianare format "YYYY-MM-DD".

Acest lucru este foarte urât, dar ar trebui să funcționeze

0
adăugat

Tehnica 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

Dacă câmpul column_datetime nu este indexat și este puțin probabil să fie (sau este puțin probabil ca indexul să fie utilizat), folosirea lui DATEDIFF() este mai scurtă.

0
adăugat

Cum se obține partea DATE a unui câmp DATETIME în MS SQL Server:

Una dintre cele mai rapide și mai rapide metode de a face acest lucru este utilizarea

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

Se evită procesarea bustului "transformarea datei într-un șir fără timp și apoi conversia din nou" logică.

De asemenea, nu afișează implementarea internă în care "porțiunea de timp este exprimată ca fracțiune" a datei.

Obțineți data primei zile din lună

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

Obțineți data rfom acum un an

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
0
adăugat

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

Avantajul este că va folosi orice index pe 'column_datetime' dacă există.

0
adăugat
Cred că CAST ('14 AUG 2008 'ca DateTime) este puțin mai bună. Cred că este puțin mai ușor de citit și cred că CAST este mai portabil decât CONVERT() în care CAST() este compatibil cu ANSI SQL-92 și -99
adăugat autor Larry OBrien, sursa
Puteți utiliza cuvântul cheie BETWEEN ca o scurtă descriere a acestui răspuns.
adăugat autor Möoz, sursa
@BorhanMooz, de fapt, BETWEEN nu captează intermedierea> =/ technet.microsoft.com/en-us/library/ms187922 .aspx , "Valoare rezultate").
adăugat autor NargothBond, sursa

În mod nsaumal, convertesc data-dată până în prezent și le comparăm, cum ar fi:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

sau

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
0
adăugat

Un punct bun despre indicele din răspunsul pe care l-ați acceptat.

Cu toate acestea, dacă căutați într-adevăr numai DATE sau DATE ranges adesea , atunci cea mai bună soluție pe care am găsit este să adăugați o altă coloană calculată persistentă tabelul dvs. care conținea numai DATE și adăugați un index pe această coloană:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

Adăugați un index pe coloana respectivă:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

Căutarea dvs. va fi și mai rapidă:

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_date = @p_date
0
adăugat
și apoi, vă sugerăm să utilizați unul dintre formatele ISO pentru date pe care cele mai multe baze de date le recunosc și nu sunt dependente de limbă/localizare, cum ar fi YYYY-MM-DD
adăugat autor van, sursa

Ceva de genul?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'
0
adăugat
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
0
adăugat
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
0
adăugat

În sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE [email protected]_date

În C # Treceți șirul scurt al valorii date utilizând funcția ToShortDateString (). probă:   DateVariable.ToShortDateString ();

0
adăugat

Data poate fi comparată în sqlserver folosind comparația șir: de exemplu.

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
0
adăugat
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
0
adăugat

Cea mai bună cale este să extrageți o parte din dată folosind funcția SQL DATE ():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
0
adăugat

There are many formats for date in SQL which are being specified. Refer https://msdn.microsoft.com/en-in/library/ms187928.aspx

Conversia și compararea coloanei varchar cu datele selectate.

Sintaxă:

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
0
adăugat