Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać pierwszą i ostatnią datę bieżącego roku?

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

Powyższe zapytanie podaje wartość datetime dla północy na początku 31 grudnia. Jest to około 24 godziny za ostatnią chwilą roku. Jeśli chcesz uwzględnić czas, który może przypadać 31 grudnia, powinieneś porównać z pierwszym dniem następnego roku, za pomocą < porównanie. Możesz też porównać z kilkoma ostatnimi milisekundami bieżącego roku, ale to nadal pozostawia lukę, jeśli używasz czegoś innego niż DATETIME (np. DATETIME2):

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
   DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear

Inne okresy

Takie podejście ma dwa fajne aspekty:dobrą wydajność i można je łatwo zmienić na inne okresy, zastępując oba wystąpienia yy (=rok) z innym ciągiem:

yy, yyyy    year
qq, q       quarter
mm, m       month
wk, ww      week 

(Uważaj na tygodnie:dzień rozpoczęcia zależy od ustawień serwera).

Szczegóły techniczne

Działa to poprzez obliczenie liczby lat od 1900 roku za pomocą DATEDIFF(yy, 0, GETDATE()) a następnie dodając to do daty zero =1 stycznia 1900. Można to zmienić, aby działało dla dowolnej daty, zastępując GETDATE() część lub dowolny rok, zastępując DATEDIFF(...) funkcja z "Rok - 1900."

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać ciąg połączenia z bazy danych

  2. Zaktualizowałem sterownik ODBC programu SQL Server i negatywnie wpłynęło to na wydajność. Co mogę zrobić?

  3. jak ustawić swoje dane poziomo

  4. Jak obliczyć sumę bieżącą w SQL bez użycia kursora?

  5. Zapytanie SQL do wyboru dat między dwiema datami