Опубликовано: 27 сен 02
Рейтинг:
Рейтинг:
Автор: Dankov
Прислал:
Документированым способом это можно сделать через конвертацию к строковому типу со специальным форматом и обратно в дату-время.
Округлить дату
declare @date datetime set @date=CONVERT(varchar(8), GETDATE(), 112)
Изъять время из даты
declare @time datetime set @time=CONVERT(varchar(8), GETDATE(), 108)
Такого же результата можно достигнуть через конвертацию даты в тип float с последующим округлением и обратным преобразованием в дату. Однако, этот способ не является документированным, так как преобразование datetime -> float недокументорованное и в следующих версиях такая конструкция может не заработать. Поэтому, не рекомендуется к применению.
Комментарии
Dogmat-iGwt: не вводите людей в заблуждение.
Convert(,,112) - на всех серверах работает ОДИНАКОВО и ни к каким ошибкам не приводит. Прежде чем поделиться мыслью, прочтите MSDN про Convert.
конвертирование в варчар и обратно может на разных sql серверах работать по разному, то есть может возникнуть смена местами месяца и числа.
Есть более универсальный способ срезать дату на всех серверах (от 2005 и выше, на 2000 не проверял)
dateadd(day,0,datediff(day,0,getdate()))
Спасибо, помогло))
Насколько всё проще стало в SQL Server 2008:
SELECT CAST(GETDATE() AS date), CAST(GETDATE() AS time)
2dburtsev1 автору dbo.datetrim ()
Метод очень не оптимальный. Значительно производительней использовать встроенные функции непосредственно в самом запросе.
select convert(datetime, floor(convert(float, getdate())) )
Оценку забыл ...
В очередной раз данный топик спасает. Спасибо ОГРОМНОЕ автору.
create function dbo.datetrim (@date datetime)
returns datetime
as
begin
-- convert datetime to date
return dateadd( day, datediff(day, 0, @date), 0);
end
/*
Values with the datetime data type are stored internally by Microsoft SQL Server as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight.
*/
select
cast(cast(cast(cast(getdate() as binary(8)) as binary(4)) as binary(8)) as datetime) [date],
cast(cast(getdate() as binary(4)) as datetime) [time]
Какая богатая фантазия :)
Работает только до 12 часов дня.