2012-05-01 11 views
53

Czy istnieje sposób użycia funkcji Now() w SQL do wybrania wartości z dzisiejszą datą? Miałem wrażenie, że Now() będzie zawierał czas i datę, ale dzisiejsza data miałaby czas ustawiony na 00:00:00, a zatem nigdy by się to nie zgadzało?Porównanie wyników z dzisiejszą datą?

+0

proszę zamieścić swoje struktury tabeli. Czy wartości dat w tabeli mają komponent czasu? –

+0

Proszę, zamieść wynik, który chcesz. –

+0

Możliwy duplikat http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – GarethD

Odpowiedz

61

Nie ma natywny Teraz function() w SQL Server więc należy użyć:

select GETDATE() --2012-05-01 10:14:13.403 

można dostać dzień, miesiąc i rok oddzielnie wykonując:

select DAY(getdate()) --1 
select month(getdate()) --5 
select year(getdate()) --2012 

jeśli jesteś na serwer sql 2008, istnieje data DATE, która ma tylko część daty, a nie czas:

select cast (GETDATE() as DATE) --2012-05-01 
+2

Teraz jest funkcją ODBC, więc można ją wywołać w MSSQL za pomocą wybierz {fn Now()} – Paul

69

OK, zróbmy to poprawnie. Wybierz daty pasujące dzisiaj, korzystając z indeksów, jeśli są dostępne, z wszystkimi różnymi typami daty/czasu.

Zasada jest taka sama w każdym przypadku. Pobieramy wiersze, w których znajduje się kolumna z datą lub po ostatniej północy (dzisiejsza data z czasem 00:00:00), i przed następną północą (jutro data z czasem 00:00:00, ale z wyłączeniem wszystkiego o tej dokładnej wartości).

Dla czystych typów daty możemy zrobić proste porównanie z dzisiejszą datą.

Aby zachować rzeczy ładnie i szybko, wyraźnie unika się manipulacji w datach przechowywanych w bazie danych (LHS z klauzuli where we wszystkich przykładach poniżej). To potencjalnie powodowałoby pełne skanowanie tabeli, ponieważ data musiałaby zostać obliczona dla każdego porównania. (To zachowanie wydaje się różnić w zależności od DBMS, YMMV).

MS SQL Server: (SQL Fiddle)

pierwsze, używając DATA

select * from dates 
where dte = CAST(CURRENT_TIMESTAMP AS DATE) 
; 

Teraz z DATETIME:

select * from datetimes 
where dtm >= CAST(CURRENT_TIMESTAMP AS DATE) 
and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) 
; 

Wreszcie z datetime2:

select * from datetimes2 
where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE) 
and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) 
; 

MySQL: (SQL Fiddle)

, na dzień:

select * from dates 
where dte = cast(now() as date) 
; 

Stosując DATETIME:

select * from datetimes 
where dtm >= cast((now()) as date) 
and dtm < cast((now() + interval 1 day) as date) 
; 

PostgreSQL: (SQL Fiddle)

Stosując DATA:

select * from dates 
where dte = current_date 
; 

pomocy timestamp bez Strefa czasowa

select * from timestamps 
where ts >= 'today' 
and ts < 'tomorrow' 
; 

Oracle: (SQL Fiddle)

, na dzień:

select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte 
from dates 
where dte >= trunc(current_date) 
and dte < trunc(current_date) + 1 
; 

Korzystanie TIMESTAMP:

select to_char(ts, 'YYYY-MM-DD HH24:MI:SS') ts 
from timestamps 
where ts >= trunc(current_date) 
and ts < trunc(current_date) + 1 
; 

SQLite: (SQL Fiddle)

Korzystanie data ciągi:

select * from dates 
where dte = (select date('now')) 
; 

Korzystanie daty i czasu ciągi:

select dtm from datetimes 
where dtm >= datetime(date('now')) 
and dtm < datetime(date('now', '+1 day')) 
; 

Korzystanie UNIX sygnatury czasowe:

select datetime(dtm, 'unixepoch', 'localtime') from datetimes 
where dtm >= strftime('%s', date('now')) 
and dtm < strftime('%s', date('now', '+1 day')) 
; 

Backup of SQL Fiddle code

+1

Używanie 'CONVERT (VARCHAR' Porównanie dat nie jest najlepsze Podejście: lepiej jest zachować daty jako daty (np. 'CAST (CURRENT_TIMESTAMP AS DATE)' lub 'DATEADD (DZIEŃ, 0, DATEDIFF (DZIEŃ, 0, CURRENT_TIMESTAMP)) ." http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – GarethD

+0

Dzięki GarethD, zaktualizowałem swoją odpowiedź – dwurf

+0

Właściwie byłem po serwerze SQL? :) – mezamorphic

4

Nie wiem dokładnie, co próbujesz zrobić, ale to brzmi jak GETDATE() jest to, co jesteś po . GETDATE() zwraca datetime, ale jeśli nie jesteś zainteresowany komponentem czasu, możesz rzutować na datę.

SELECT GETDATE() 
SELECT CAST(GETDATE() AS DATE) 
4

Po prostu wyzeruj element czasu daty. na przykład

select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) 

Użyłem GetDate jak to funkcja MSSQL, jak już oznaczone, ale teraz() jest prawdopodobnie MySQL lub używasz wywołanie funkcji ODBC, nadal powinno działać, jeśli tylko wymienić jeden z inny.

6

Nie jesteś pewien, o co pytasz!

Jednak

SELECT GETDATE() 

będzie Ci aktualną datę i czas

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

będzie Ci tylko datę z czasem ustawionym na 00:00:00

3

budynek na poprzedni odpowiedzi, proszę zauważyć ważny punkt, musisz także manipulować kolumną tabeli, aby upewnić się, że nie zawiera fragmentu czasu z datetu ime datatype.

Poniżej jest mały skrypt wykazania powyższego:

select getdate() 
--2012-05-01 12:06:51.413 
select cast(getdate() as date) 
--2012-05-01 

--we're using sysobjects for the example 
create table test (id int) 
select * from sysobjects where cast(crdate as date) = cast(getdate() as date) 
--resultset contains only objects created today 
drop table test 

Mam nadzieję, że to pomaga.

EDIT:
następujący komentarz @dwurf (dzięki) o efekcie powyższy przykład może mieć na wydajność, chciałbym zaproponować następujące zamiast. Tworzymy zakres dat pomiędzy dzisiaj o północy (początek dnia) a ostatnią milisekundą dnia (serwer SQL liczy do 0,997, dlatego zmniejszam o 3 milisekundy). W ten sposób unikniemy manipulowania lewą stroną i unikniemy wpływu na wydajność.

select getdate() 
--2012-05-01 12:06:51.413 
select dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime)) 
--2012-05-01 23:59:59.997 
select cast(getdate() as date) 
--2012-05-01 

create table test (id int) 
select * from sysobjects where crdate between cast(getdate() as date) and dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime)) 
--resultset contains only objects created today 
drop table test 
+0

Nie zawsze najlepsza rzecz do zrobienia. Jeśli masz milion dat w tabeli, to szybko zrujnujesz swój plan wykonania. – dwurf

1

Jeśli masz tabelę z zaledwie data przechowywana (brak czasu) i chcą dostać te o „teraz”, to można to zrobić:

SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0 

Wynika to w wierszach, które dzień różnica wynosi 0 (więc dzisiaj).

0

Możesz wypróbować ten kod SQL;

SELECT [column_1], [column_1], ...  
    FROM (your_table) 
    where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y') 
0

gdzie CREATED_DATE między CURRENT_TIMESTAMP-180 i CURRENT_TIMESTAMP

Powiązane problemy