Guida istruzione SQL & # 8212; Seleziona i clienti che hanno ordinato oggi
Domanda
Supponi di avere una tabella in cui sono archiviati gli ID ordine dei clienti. Come
| ID cliente | ID ordine | Data ordine
Come posso ottenere tutti i clienti che hanno ordinato oggi?
Anche OrderDate sarebbe un DateTime.
Qualcosa di simile
SELECT DISTINCT CustomerID
FROM TableName
Where OrderDate > Today
Ma l'ultima parte è ciò che non riesco a capire.
Soluzione
È abbastanza comune desiderare solo una data fuori da un datetime - dovresti essere in grado di Google per le specifiche del tuo RDBMS (dal momento che non lo dici). L'importante è rendere la tua query SARGable trasformando la data di oggi 1 - non la data dell'ordine.
Per MSSQL, qualcosa del genere
SELECT DISTINCT CustomerID
FROM TableName
--I assume you want midnight orders as well - so use >=
Where OrderDate >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
funzionerebbe prendendo il numero di giorni oggi a partire dalla Data 0 ( DATEDIFF (dd, 0, GETDATE ())
) e aggiungendoli alla Data 0 ( DATEADD (dd, 0 , x)
). Questo è specifico per T-SQL, tuttavia.
1 Se stessi cercando una data arbitraria, trasformeresti comunque entrambi gli argomenti:
SELECT DISTINCT CustomerID
FROM TableName
Where
OrderDate >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
--You *do not* want midnight of the next day, as it would duplicate orders
AND OrderDate < DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()) + 1)
Altri suggerimenti
In Oracle la dichiarazione sarebbe simile a:
SELECT DISTINCT CustomerID
FROM TableName
Where OrderDate >= trunc(sysdate)
SQL Server dovrebbe essere simile
SELECT DISTINCT CustomerID
FROM TableName
Where OrderDate = CAST(GetDate() AS NUMERIC)
o
SELECT DISTINCT CustomerID
FROM TableName
Where CAST(OrderDate AS NUMERIC) = CAST(GetDate() AS NUMERIC)
Ho provato a vedere che restituisce lo stesso numero per la data specificata con un orario diverso. Pertanto, dovrebbe funzionare quando una data viene convertita nel suo valore numerico.
SELECT CAST (0 AS DATETIME)
restituisce 1/1/1900 12:00:00 AM