sql >> Database >  >> RDS >> Sqlserver

Wat is de beste manier om een ​​datum in SQL Server af te kappen?

Om af te ronden op de dichtstbijzijnde hele dag , zijn er drie benaderingen die op grote schaal worden gebruikt. De eerste gebruikt datediff om het aantal dagen te vinden sinds de 0 datum Tijd. De 0 datetime komt overeen met 1 januari 1900. Door het dagverschil toe te voegen aan de startdatum, heb je afgerond op een hele dag;

select dateadd(d, 0, datediff(d, 0, getdate()))

De tweede methode is op tekst gebaseerd:het kapt de tekstbeschrijving af met varchar(10) , waarbij alleen het datumgedeelte overblijft:

select convert(varchar(10),getdate(),111)

De derde methode maakt gebruik van het feit dat een datetime is echt een drijvende komma die het aantal dagen sinds 1900 vertegenwoordigt. Dus door het af te ronden op een geheel getal, bijvoorbeeld met behulp van floor , je krijgt het begin van de dag:

select cast(floor(cast(getdate() as float)) as datetime)

Om uw tweede vraag te beantwoorden, het begin van de week is lastiger. Een manier is om de dag van de week af te trekken:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Dit retourneert ook een tijdsdeel, dus je zou het moeten combineren met een van de time-stripping-methoden om bij de eerste date te komen. Bijvoorbeeld met @start_of_day als een variabele voor leesbaarheid:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)

Het begin van het jaar, maand, uur en minuut werk nog steeds met de "verschil sinds 1900"-benadering:

select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)

Afronding op seconde vereist een andere benadering, aangezien het aantal seconden sinds 0 geeft een overloop. Een manier om dat te omzeilen is het gebruik van het begin van de dag, in plaats van 1900, als referentiedatum:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)

Om met 5 minuten af ​​te ronden , pas de minutenafrondingsmethode aan. Neem het quotiënt van het minuutverschil, bijvoorbeeld met /5*5 :

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Dit werkt ook voor kwartieren en halve uren.



  1. Hoe lijst doorgeven van Java naar Oracle Procedure?

  2. Mechanismen voor het volgen van wijzigingen in het databaseschema

  3. Een postgresql-database maken met psycopg2

  4. De 9 meest voorkomende fouten bij het ontwerpen van databases