Microsoft SQL Server
Transact-SQL

Отрезать время от даты и дату от даты-времени. Округлить дату

Опубликовано: 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)

  • 06 августа 2008, 17:40 Александр Волок (def1983)

    2dburtsev1 автору dbo.datetrim ()

    Метод очень не оптимальный. Значительно производительней использовать встроенные функции непосредственно в самом запросе.

  • select convert(datetime, floor(convert(float, getdate())) )

  • 01 апреля 2008, 21:44 ДмитрийДрозд

    Оценку забыл ...

  • 01 апреля 2008, 21:43 ДмитрийДрозд

    В очередной раз данный топик спасает. Спасибо ОГРОМНОЕ автору.

  • create function dbo.datetrim (@date datetime)
    returns datetime
    as
    begin
    -- convert datetime to date
    return dateadd( day, datediff(day, 0, @date), 0);
    end

  • 21 февраля 2007, 15:10 Все документировано в BOL

    /*
    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]

  • Какая богатая фантазия :)

  • 02 марта 2005, 11:00 Дмитрий16

    Работает только до 12 часов дня.



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Transact-SQL / Отрезать время от даты и дату от даты-времени. Округлить дату