Ho due tabelle in cui la colonna [date]
è di tipo DATETIME2(0)
.
Devo confrontare due record solo con le loro parti Data (giorno + mese + anno), scartando Parti tempo (ore + minuti + secondi).
Come lo posso fare?
Ho due tabelle in cui la colonna [date]
è di tipo DATETIME2(0)
.
Devo confrontare due record solo con le loro parti Data (giorno + mese + anno), scartando Parti tempo (ore + minuti + secondi).
Come lo posso fare?
Risposte:
Un piccolo svantaggio nella risposta di Marc è che entrambi i campi della data sono stati tipizzati, il che significa che non sarai in grado di sfruttare alcun indice.
Pertanto, se è necessario scrivere una query che può beneficiare di un indice in un campo data, è necessario il seguente approccio (piuttosto contorto).
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: Un altro modo per estrarre solo la data (nelle versioni precedenti di SQL Server) è usare un trucco di come la data è rappresentata internamente.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Anche se ho votato a favore la risposta contrassegnata come corretta. Volevo toccare alcune cose per chiunque inciampasse su questo.
In generale, se stai filtrando in modo specifico solo sui valori di Data . Microsoft consiglia di utilizzare il formato lingua neutra di ymd
o y-m-d
.
Si noti che il modulo "2007-02-12" è considerato indipendente dalla lingua solo per i tipi di dati DATE, DATETIME2 e DATETIMEOFFSET.
Fare un confronto delle date usando l'approccio sopra menzionato è semplice. Considera il seguente esempio inventato.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
In un mondo perfetto, è necessario evitare qualsiasi manipolazione della colonna filtrata perché ciò può impedire a SQL Server di utilizzare gli indici in modo efficiente. Detto questo, se i dati che stai memorizzando riguardano solo la data e non l'ora, considera la memorizzazione come DATETIME
a mezzanotte come l'ora. Perché:
Quando SQL Server converte il valore letterale nel tipo di colonna filtrata, presuppone la mezzanotte quando non viene indicata una parte temporale. Se si desidera che un filtro di questo tipo restituisca tutte le righe dalla data specificata, è necessario assicurarsi di archiviare tutti i valori con mezzanotte come ora.
Quindi, supponendo che ti interessi solo della data e memorizzi i tuoi dati come tali. La query sopra può essere semplificata per:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
Puoi provare questo
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
Lo provo per MS SQL 2014 seguendo il codice
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
Per confrontare due date come MM / GG / AAAA con MM / GG / AAAA . Ricorda che per prima cosa il tipo di colonna del campo deve essere dateTime. Esempio: columnName: payment_date dataType: DateTime .
dopo puoi facilmente confrontarlo. La query è:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
È molto semplice ...... Lo ha testato .....