sql >> Databáze >  >> RDS >> Sqlserver

Jak zjistit první a poslední datum aktuálního roku?

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

Výše uvedený dotaz poskytuje hodnotu datetime pro půlnoc na začátku 31. prosince. To je asi 24 hodin do posledního okamžiku roku. Pokud chcete zahrnout čas, který by mohl nastat 31. prosince, měli byste porovnat s prvním v příštím roce pomocí < srovnání. Nebo můžete porovnat s několika posledními milisekundami aktuálního roku, ale stále ponechává mezeru, pokud používáte něco jiného než DATETIME (například 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

Další období

Tento přístup má dva pěkné aspekty:dobrý výkon a lze jej snadno změnit na jiná období nahrazením obou výskytů yy (=rok) s jiným řetězcem:

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

(Pozor na týdny:počáteční den závisí na nastavení serveru.)

Technické podrobnosti

Funguje to tak, že se zjistí počet let od roku 1900 pomocí DATEDIFF(yy, 0, GETDATE()) a poté to přičteme k datu nula =1. ledna 1900. Toto lze změnit tak, aby fungovalo pro libovolné datum nahrazením GETDATE() část nebo libovolný rok nahrazením DATEDIFF(...) funkce s "Rok - 1900."

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


  1. Docker-compose zkontrolujte, zda je připojení mysql připraveno

  2. 3 způsoby, jak získat seřazení sloupce v MariaDB

  3. Exportujte výsledky dotazů Oracle do souboru HTML při použití SQLcl

  4. Jaký je nejrychlejší způsob výpočtu mediánu?