Jak uzyskać aktualną datę bez części czasowej

83

W SQL Server 2005 jak uzyskać bieżącą datę bez części czasu? Używałem, GETDATE()ale chciałbym, aby miał czas 00: 00: 00.0

Piers Myers
źródło

Odpowiedzi:

119

Najszybciej jeśli masz iteracyjne nad zestawu rekordów i nie ma datę w SQL Server 2008

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

Wyróżniają się dwie różne i doskonałe odpowiedzi na StackOverflow: jeden , dwa

Konwersje Varchar są jednym z najgorszych sposobów na to. Oczywiście dla jednej wartości może to nie mieć znaczenia, ale warto się w nią przyzwyczaić.

Ten sposób jest również deterministyczny, powiedzmy, jeśli chcesz zaindeksować kolumnę obliczaną. Nawet osoby piszące książki o SQL Server przyłapują się na konwersji danych w czasie

Ta technika jest również rozszerzalna.

  • wczoraj: DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
  • początek miesiąca: DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
  • koniec ostatniego miesiąca: DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
  • początek następnego miesiąca: DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)

Edytować:

Jak wspomniałem o determinizmie, metody varchar nie są bezpieczne, chyba że użyjesz stylu 112.

Inne odpowiedzi tutaj wskazują, że nigdy nie zastosowałbyś tego do kolumny. Jest to poprawne, ale możesz chcieć wybrać 100 tys. Wierszy lub tylko dodać kolumnę obliczeniową lub GROUP BY tylko. Następnie musisz użyć tej metody.

Inna odpowiedź wspomina również o stylu 110. To nie jest język ani SET DATEFORMAT bezpieczne i zawodzi przy ustawieniu języka „brytyjskiego”. Zobacz ostateczny przewodnik po typach datetime autorstwa Tibora Karaszi.

gbn
źródło
1
Podany link jest martwy.
Viswanathan Iyer
6

Musisz przekonwertować go na varchar, określając wzorzec formatu (w tym przypadku 110), a następnie przekonwertować (lub rzutować) z powrotem na datę i godzinę.

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)
mrdenny
źródło