2012-06-03 15 views
8

Non riesco a ottenere tutte le righe create oggi. Ho usato più funzioni come getdate(), Cast, Convert, ecc. Ma tutto invano.Ottenere tutte le righe create oggi

Questa è la mia domanda di base:

SELECT timeId 
FROM table_roaster_time_table 
WHERE (user_id = @user_id) AND (DATEDIFF(d, date, GETDATE()) = 0) 

voglio ottenere il timeId dal tavolo table_roaster_time_table in cui saranno forniti userid e la data di oggi.

Come posso fare?

+0

è inutile. ho provato entrambe le risposte di urs. ma il tipo di dati che ho impostato per la data è datetime. un'altra cosa è che non posso usare il valore statico come '6/01/2012' perché voglio impostare il calendario dei girarrosti su base giornaliera e per questo voglio data corrente giornaliera. Ho anche usato DAY (date) = Day (getdate() ma non funziona. e recupera valore null per timeid, ma ho già 2 record in esso 1 hanno il 3/6/2012 e l'altro ha 2/6/2012 data e record – iConfused

+3

Sei sicuro che "3/6/2012" è il 3 giugno e non il 6 marzo? –

+1

Dovresti anche evitare di usare parole riservate (e molto vaghe) come 'date' come nomi di colonne.' Created_date' è più lungo ma evita una parola chiave riservata e descrive meglio i dati in quella colonna. –

risposta

22

Al fine di mantenere una possibilità di utilizzare un indice sulla colonna [date] (anche se non ne esiste oggi, potrebbe in futuro), provare:

AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)) 
AND [date] < DATEADD(DAY, 1, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

Se stai usando SQL Server 2008 o meglio, si può fare qualcosa di simile per abbreviare il codice, ma ancora fare uso di un indice su [date] se ne esiste uno:

AND CONVERT(DATE, [date]) = CONVERT(DATE, CURRENT_TIMESTAMP); 

EDIT

Dal momento che ti sembra di essere confuso perché 3/6/2012 è 6 marzo e non il 3 giugno, potrei anche suggerire che invece di inserire manualmente data letterali ambigue come '3/6/2012' nel database, si effettua la colonna un default come ad esempio:

ALTER TABLE dbo.table_roaster_time_table 
    ALTER COLUMN [date] DATETIME NOT NULL; 

ALTER TABLE dbo.table_roaster_time_table 
    ADD CONSTRAINT df_date DEFAULT (CURRENT_TIMESTAMP) 
    FOR [date]; 

Se avete intenzione di inserire la data letterali allora almeno utilizzare un formato sicuro e inequivocabile, come ad esempio YYYYMMDD:

INSERT dbo.table_roaster_time_table([date]) VALUES('20120603'); 

Ora non c'è confusione.

+0

+1 Mi piace usare CONVERT (DATE, x) per troncare la parte time, comunque. – usr

+0

@usr Non so che l'OP è possibile utilizzare 'DATE' in quanto non è stata specificata alcuna versione di SQL Server. In caso di dubbio, cerco sempre di ricordare di utilizzare i valori minimi t denominatore comune (funzionerà nel 2000 e nel 2005 fino al 2012). –

+0

@AaronBertrand +1. Fuori interesse, c'è qualche vantaggio nell'usare 'CURRENT_TIMESTAMP' su' GetDate() '? – Bridge

Problemi correlati