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

T-SQL datetime afrundet til nærmeste minut og nærmeste timer med brug af funktioner

declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

vender tilbage

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

Ovenstående afkorter blot sekunderne og minutterne, hvilket giver de resultater, der blev bedt om i spørgsmålet. Som @OMG Ponies påpegede, hvis du vil runde op/ned, kan du tilføje henholdsvis et halvt minut eller en halv time og derefter afkorte:

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

og du får:

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

Før datodatatypen blev tilføjet i SQL Server 2008, ville jeg bruge ovenstående metode til at afkorte tidsdelen fra en datetime for kun at få datoen. Ideen er at bestemme antallet af dage mellem det pågældende dato og klokkeslæt og et fast tidspunkt (0 , som implicit kaster til 1900-01-01 00:00:00.000 ):

declare @days int
set @days = datediff(day, 0, @dt)

og føj derefter det antal dage til det faste tidspunkt, hvilket giver dig den oprindelige dato med tiden indstillet til 00:00:00.000 :

select dateadd(day, @days, 0)

eller mere kortfattet:

select dateadd(day, datediff(day, 0, @dt), 0)

Brug af en anden datodel (f.eks. hour , mi ) vil fungere i overensstemmelse hermed.



  1. Hvordan gendanner jeg en dump-fil fra mysqldump?

  2. Returner kun række, hvis værdien ikke eksisterer

  3. Brug af INNER JOIN til at kombinere SQL Server-tabeller og vise dem i ASP.NET-webformularer

  4. Anbefalinger til understøttelse af både Oracle og SQL Server i den samme ASP.NET-app med NHibernate