2012-06-03 15 views
8

Nie mogę uzyskać wszystkich utworzonych dzisiaj wierszy. Użyłem wielu funkcji, takich jak getdate(), Cast, Convert itd., Ale wszystko na próżno.Otrzymywanie wszystkich utworzonych dzisiaj wierszy

To mój podstawowy zapytania:

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

Chcę uzyskać timeId z tabeli table_roaster_time_table gdzie userid zostanie dostarczona, a data jest dzisiaj.

Jak to zrobić?

+0

to bezużyteczne. Próbowałem obu odpowiedzi urs. ale typem, który ustawiłem dla daty, jest datetime. Inną rzeczą jest to, że nie mogę używać wartości statycznej, takiej jak "6/01/2012", ponieważ chcę ustawić harmonogram pieczenia codziennie i do tego chcę dziennej bieżącej daty. użyłem również DAY (date) = Day (getdate(), ale to też nie działa i pobiera wartość null dla timeid, ale mam 2 rekordy już w nim 1 mają 3/6/2012, a drugi ma 2/6/2012 data i zapisy – iConfused

+3

Czy jesteś pewien, że "3/6/2012" to 3 czerwca, a nie 6 marca? –

+1

Należy również unikać używania zastrzeżonych (i bardzo niejasnych) słów, takich jak 'date' jako nazw kolumn.' Created_date' jest dłuższa ale unika zastrzeżonego słowa kluczowego i lepiej opisuje dane w tej kolumnie . –

Odpowiedz

22

W celu utrzymania szansę wykorzystania indeksu na kolumnie [date] (nawet jeśli nie istnieje dzisiaj, to może w przyszłości), spróbuj:

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

Jeśli używasz SQL Server 2008 lub lepsza, można zrobić coś takiego, aby skrócić kod ale nadal skorzystać z indeksu na [date] jeśli taki istnieje:

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

EDIT

Ponieważ wydaje się być zdezorientowany dlaczego 3/6/2012 jest 06 marca, a nie 03 czerwca, mogę również sugerują, że zamiast ręcznego wstawiania niejednoznaczne date literały jak '3/6/2012' do bazy danych, należy dokonać kolumna domyślnie takie jak:

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

Jeśli masz zamiar wstawić datę literały to przynajmniej użyciu bezpiecznego i jednoznacznego formatu, takich jak YYYYMMDD:

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

teraz nie ma nieporozumień.

+0

+1 Chciałbym użyć CONVERT (DATA, X), aby skrócić część czasu, ale – usr

+0

@usr Nie wiem, że OP może używać 'DATE', ponieważ nie podano żadnej wersji SQL Server, aw razie wątpliwości zawsze staram się pamiętać o używaniu lowes t wspólny mianownik (to będzie działać w latach 2000 i 2005 aż do 2012 roku). –

+0

@AaronBertrand +1. W interesie jest jakaś korzyść z używania 'CURRENT_TIMESTAMP' zamiast' GetDate() '? – Bridge

Powiązane problemy