W SQL Server 2005, jak uzyskać bieżącą datę bez części czasu? Używam GETDATE()
, ale chciałbym, aby był to czas 00: 00: 00.0
Odpowiedź
najszybszy , jeśli musisz iterować po zestawie rekordów i nie masz daty w SQL Server 2008
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
Dwie różne i doskonałe odpowiedzi w StackOverflow potwierdzają to: Jedna , Dwie
Konwersje Varchar to jeden z najgorszych sposobów na zrobienie tego. Oczywiście dla jednej wartości może to nie mieć znaczenia, ale jest to dobry nawyk.
Ten sposób jest również deterministyczny powiedz, jeśli chcesz zindeksować kolumnę obliczeniową. Nawet ludzie, którzy piszą książki o SQL Server, są przyłapani na konwersjach daty i godziny
Technikę tę można również rozszerzyć.
- wczoraj:
DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
- początek miesiąca:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
- koniec ostatniego miesiąc:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
- początek następnego miesiąca:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)
Edytuj :
Jak wspomniałem o determinizmie, metody varchar nie są bezpieczne, chyba że użyjesz stylu 112.
Inne odpowiedzi wskazują, że nigdy nie zastosowałbyś tego do kolumny. To jest poprawnie, ale możesz chcieć wybrać 100 tys. wierszy lub dodać kolumnę obliczeniową lub tylko datę GROUP BY. Następnie musisz użyć tej metody.
Druga odpowiedź również wspomina styl 110. To nie jest język ani SET DATEFORMAT jest bezpieczny i nie działa z ustawieniem języka „brytyjski”. Zobacz ostateczny przewodnik po typach danych datetime autorstwa Tibora Karaszi.
Komentarze
- Podano lin k nie żyje.
Odpowiedź
Musisz przekonwertować go na varchar, podając wzorzec formatu (110 w tym case), a następnie przekonwertuj (lub rzuć) z powrotem na datę i godzinę.
select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)