2012-06-03 17 views
8

Ich kann nicht alle heute erstellten Zeilen abrufen. Ich habe mehrere Funktionen wie getdate(), Cast, Convert usw. verwendet, aber alles vergebens.Abrufen aller heute erstellten Zeilen

Das ist mein Grund Abfrage:

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

Ich mag table_roaster_time_table die timeId vom Tisch bekommen, wo userid zur Verfügung gestellt wird, und das Datum heute ist.

Wie mache ich das?

+0

es ist nicht von Nutzen. Ich habe beide Antworten ausprobiert. aber der Datentyp, den ich für das Datum eingestellt habe, ist datetime. Eine andere Sache ist, dass ich keinen statischen Wert wie '6/01/2012' verwenden kann, da ich den Zeitplan der Röster auf täglicher Basis festlegen möchte und dafür täglich aktuelles Datum möchte. Ich habe auch DAY (date) = Day (getdate() verwendet, aber es funktioniert auch nicht. und ruft null Wert für timeid ab, aber ich habe 2 Datensätze bereits drin 1 habe 3/6/2012 und der andere hat 2/6/2012 Datum und Aufzeichnungen – iConfused

+3

Sind Sie sicher "3/6/2012" ist 3. Juni und nicht 6. März? –

+1

Sie sollten auch vermeiden, reservierte (und sehr vage) Wörter wie "date" als Spaltennamen zu verwenden. 'Created_date' ist länger aber es vermeidet ein reserviertes Schlüsselwort und beschreibt die Daten in dieser Spalte besser .. –

Antwort

22

Um eine Chance zu halten von einem Index für die [date] Spalt (auch wenn man heute nicht mehr existiert, kann es in der Zukunft), versuchen:

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

Wenn Sie SQL verwenden Server 2008 oder besser, können Sie etwas tun, den Code zu verkürzen, aber immer noch die Verwendung eines Index auf [date] machen, wenn ein solches vorhanden ist:

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

EDIT

Da Sie verwirrt zu sein scheinen, warum 3/6/2012 6. März ist und nicht 3. Juni ich könnte darauf hindeuten, dass an Stelle mehrdeutig Datumsliterale wie '3/6/2012' in die Datenbank manuell Einfügen Sie die Spalte eine Standard, wie zB:

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]; 

Wenn Sie Datumsliterale einfügen gehen dann zumindest verwenden, um ein sicheres und eindeutiges Format, wie YYYYMMDD:

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

Jetzt gibt es keine Verwirrung.

+0

+1 Ich benutze gerne CONVERT (DATE, x) um den Time-Teil abzukürzen, aber – usr

+0

@usr Ich weiß nicht, dass das OP kann "DATE" verwenden, da keine Version von SQL Server angegeben wurde. Im Zweifelsfall versuche ich immer daran zu denken, die Lowes zu verwenden t gemeinsamer Nenner (dies wird bis zum Jahr 2000 und 2005 bis 2012 funktionieren). –

+0

@AaronBertrand +1. Interessant, gibt es einen Vorteil, 'CURRENT_TIMESTAMP' über' GetDate() 'zu verwenden? – Bridge

Verwandte Themen