sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er den bedste måde at afkorte en dato i SQL Server?

At runde til nærmeste hele dag , er der tre tilgange i bred brug. Den første bruger datediff for at finde antallet af dage siden 0 dato tid. 0 datetime svarer til den 1. januar 1900. Ved at lægge dagsforskellen til startdatoen, har du afrundet til en hel dag;

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

Den anden metode er tekstbaseret:den afkorter tekstbeskrivelsen med varchar(10) , så kun datodelen er tilbage:

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

Den tredje metode bruger det faktum, at en datetime er virkelig et flydende komma, der repræsenterer antallet af dage siden 1900. Så ved at afrunde det til et helt tal, for eksempel ved at bruge floor , får du starten på dagen:

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

For at besvare dit andet spørgsmål, ugens start er vanskeligere. En måde er at trække ugedagen fra:

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

Dette returnerer også en tidsdel, så du bliver nødt til at kombinere den med en af ​​de time-stripping metoder for at komme til den første date. For eksempel med @start_of_day som en variabel for læsbarhed:

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)

årets begyndelse, måned, time og minut arbejder stadig med "forskel siden 1900"-tilgangen:

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)

Afrunding efter sekund kræver en anden tilgang, da antallet af sekunder siden 0 giver overløb. En vej rundt er at bruge starten af ​​dagen i stedet for 1900 som referencedato:

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)

At runde med 5 minutter , juster minutafrundingsmetoden. Tag kvotienten af ​​minutforskellen, for eksempel ved at bruge /5*5 :

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

Dette virker også i kvarter og halve timer.



  1. Indstil PDO til at kaste undtagelser som standard

  2. Top databaseblogs at følge

  3. Hvordan importerer jeg moduler eller installerer udvidelser i PostgreSQL 9.1+?

  4. Sammenligning af fejltider for Amazon Aurora, Amazon RDS og ClusterControl