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ą?
Odpowiedz
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
Teraz jest funkcją ODBC, więc można ją wywołać w MSSQL za pomocą wybierz {fn Now()} – Paul
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'))
;
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
Dzięki GarethD, zaktualizowałem swoją odpowiedź – dwurf
Właściwie byłem po serwerze SQL? :) – mezamorphic
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)
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.
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
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
Nie zawsze najlepsza rzecz do zrobienia. Jeśli masz milion dat w tabeli, to szybko zrujnujesz swój plan wykonania. – dwurf
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).
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')
gdzie CREATED_DATE między CURRENT_TIMESTAMP-180 i CURRENT_TIMESTAMP
- 1. Porównaj ciąg z dzisiejszą datą w javascript
- 2. Korzystanie kontrolę CompareValidator porównać datę wejścia użytkownika z dzisiejszą datą
- 3. Jak sortować zestaw kwerend Django przed datą dzisiejszą?
- 4. Jak utworzyć zmienną w PHP z dzisiejszą datą formatu MM/DD/RRRR?
- 5. Obliczanie dnia z datą
- 6. Jakiekolwiek rozwiązanie problemu z dzisiejszą obliczoną kolumną to SharePoint?
- 7. FreeMarker Bieżąca data Porównanie
- 8. Pobierz obiekty z datą większą niż dzisiaj lub pustą datą.
- 9. Czasowa kategoria Groovy z datą lokalną i datą lokalną
- 10. Oracle porównując datownik z datą
- 11. użyciu from_string z datą doładowania
- 12. Initialize NSDate z datą niestandardowego
- 13. git ls-files z datą?
- 14. Knitr zachowanie z datą obiektów
- 15. Liczba dni między datą bieżącą a datą
- 16. PHP: Urodziny sprawdź dzisiejszą datę
- 17. Sprawdź, czy data X jest za datą Y z JodaTime
- 18. Porównanie EL z równąIgnoreCase
- 19. czy możliwe jest porównanie wyników testów z dwóch niesekwencyjnych miejsc pracy w jenkins?
- 20. Porównanie daty MongoDB
- 21. Porównanie stringów serwera SQL
- 22. Porównanie wielu macierzy matlab
- 23. PHP: Jak porównać ciąg czasu z datą ("H: i")?
- 24. Pobierz dzisiejszą datę w Javie o północy
- 25. Oracle SQL jak usunąć razem z datą
- 26. Jak wstawić dokument z datą w mongo?
- 27. Możliwy błąd PHP z date_default_timezone_set i datą?
- 28. Prefixing logi z datą w skrypcie powłoki
- 29. Wybierz unikalny rekord z najnowszą datą utworzenia
- 30. php - Sortuj tablicę z datą jako kluczem
proszę zamieścić swoje struktury tabeli. Czy wartości dat w tabeli mają komponent czasu? –
Proszę, zamieść wynik, który chcesz. –
Możliwy duplikat http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – GarethD