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) 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *