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.