Domanda

In SQL Server ho un DATETIME colonna che comprende un elemento di tempo.

Esempio:

'14 AUG 2008 14:23:019'

Qual è il migliore metodo per selezionare solo i record di un determinato giorno, ignorando la parte del tempo?

Esempio:(Non è sicuro, in quanto non corrisponde a parte e non restituisce righe)

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

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Nota:Dato che questo sito è anche annotare le note e le tecniche di pick up e poi dimenticate, vado a postare la mia personale risposta a questa domanda, come DATETIME roba in MSSQL è probabilmente l'argomento mi ricerca più SQLBOL.


Aggiornamento Chiarito esempio per essere più specifici.


Modifica Scusa, Ma ho dovuto down-mod risposte ERRATE (le risposte che restituiscono un risultato errato).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') tornerà il 13 e il 14.

@wearejimbo: Vicino, ma nessun sigaro! badge che vi è stato assegnato.Ti sei perso i record scritti a 14/08/2008 23:59:001 23:59:999 (es.Meno di 1 secondo prima della mezzanotte.)

È stato utile?

Soluzione

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

Il vantaggio di questo è che l'uso di qualsiasi indice 'column_datetime' se esiste.

Altri suggerimenti

In SQL Server 2008, è possibile utilizzare il nuovo tipo di dati DATA

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

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

@Ragazzo.Penso che troverete che questa soluzione bilancia bene.Avere uno sguardo al piano di esecuzione della query di query originale.

E per miniera:

Basta confrontare l'anno, il mese e il giorno di valori.

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)

Qualcosa di simile a questo?

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

Tecnica 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

Se il column_datetime campo non è indicizzato, ed è improbabile che essere (o l'indice è improbabile per essere utilizzato), quindi utilizzando la funzione DATEDIFF() è più breve.

Buon punto circa l'indice nella risposta che hai accettato.

Ancora, se davvero di cercare solo su specifica DATE o DATE ranges spesso, quindi la soluzione migliore che ho trovato è quello di aggiungere un'altra colonna calcolata persistente al tavolo che contengono il DATE, e aggiungere indice in questa colonna:

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

Aggiungere indice colonna:

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

La ricerca sarà ancora più veloce:

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

SELECT   *
FROM     table1
WHERE    column_date = @p_date

Questa funzione Cast(Piano(Cast(GetDate() As Float)) As DateTime) restituisce un tipo di dati datetime con la porzione di tempo rimosso e potrebbe essere utilizzato come.

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

o

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

Come ottenere la DATA porzione di un campo di tipo DATETIME MS SQL Server:

Uno dei modo più rapido e più grazioso modi per farlo è utilizzando

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

Evita la CPU sballare "convertire la data in una stringa senza il tempo e la conversione di nuovo" la logica.

Essa, inoltre, non esporre l'implementazione interna che la "parte del tempo è espresso come una frazione della data.

La data del primo giorno del mese

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

La data rfom 1 anno fa

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

Io di solito la conversione della data e dell'ora la data e confrontarli, come questi:

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

o

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

So che questo non è esattamente come la si vuole fare questo, ma potrebbe essere un inizio:

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)

Questo permette di convertire il datatime e la stringa in varchar del formato "AAAA-MM-GG".

Questo è molto brutto, ma dovrebbe funzionare

La data può essere paragonato in sqlserver si utilizza la stringa di confronto:ad es.

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
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

Il modo migliore è quello di estrarre la parte di data utilizzando SQL per la Funzione DATE ():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

Ci sono molti formati per la data in SQL che possono essere specificate.Riferimento https://msdn.microsoft.com/en-in/library/ms187928.aspx

La conversione e il confronto colonna varchar con le date selezionate.

Sintassi:

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

In sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

In C# Passa il breve stringa di valore di data utilizzando ToShortDateString() funzione.esempio:DateVariable.ToShortDateString();

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top