Sql применяет слово в Datetime, где этаж не является стандартным, например, каждые 2 часа, каждые 2 дня и т. Д. - PullRequest
0 голосов
/ 28 февраля 2019

Цель : Sql, применяющий слово в Datetime, где этаж не является стандартным, например, каждые 2 часа, каждые 3 дня.Вместо стандартного каждый час, каждый день и т. Д.

общего назначения : включить сравнение данных для каждого периода сбора.когда период сбора превышает стандартную единицу времени.Сохраняя преимущества типа Datetime.

Пример преобразования:

этаж дата-время до 2 часов

+==========================+=======================+
|        WhenCreated       |       Time_Slot       |
+==========================+=======================+
|   2019-02-28 00:34:00    | 2019-02-28 00:00:00   |
+--------------------------+-----------------------+
|   2019-02-28 01:34:00    | 2019-02-28 00:00:00   |
+--------------------------+-----------------------+
|   2019-02-28 02:00:00    | 2019-02-28 02:00:00   |
+--------------------------+-----------------------+
|   2019-02-28 02:20:00    | 2019-02-28 02:00:00   |
+--------------------------+-----------------------+
|   2019-02-28 03:59:00    | 2019-02-28 02:00:00   |
+--------------------------+-----------------------+

ТекущийРешение:

внутри оператора выбора создаст новый столбец [Time_Slot] на основе [WhenCreated]:

left(convert(varchar(30), WhenCreated, 102),4) + '-' + left(right(convert(varchar(30), WhenCreated, 102),5),2) + '-' + right(convert(varchar(30), WhenCreated, 102),2) + ' ' +
    case
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('00','01') then '00:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('02','03') then '02:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('04','05') then '04:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('06','07') then '06:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('08','09') then '08:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('10','11') then '10:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('12','13') then '12:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('14','15') then '14:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('16','17') then '16:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('18','19') then '18:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('20','21') then '20:00:00.000'
        when left(cast(cast(WhenCreated as time) as varchar(30)),2) in ('22','23') then '22:00:00.000'
    end as [Time_Slot]

Текущий вызов: Текущее решениеработает, но это грязно.Должен быть более простой метод.Итак, что является лучшим способом сделать это?

Редактировать: исправлена ​​ошибка в таблице.

1 Ответ

0 голосов
/ 28 февраля 2019

Деконструируйте дату на ее части, затем реконструируйте ее, используя необходимые части, настраивая ту часть, которая должна быть дана по полу.

Чтобы сложить целое значение с множителем, просто разделите на множитель иумножьте это снова.Это основано на целочисленном делении, усечающем результат деления, например, 5 / 2 = 2, то есть 5 / 2 * 2 = 4, то есть усеченном до кратного 2.

Таким образом, чтобы умножить значение WhenCreated на кратное 2 часа:

DATETIMEFROMPARTS ( YEAR(WhenCreated), MONTH(WhenCreated), DAY(WhenCreated),
                    DATEPART(HOUR, WhenCreated) / 2 * 2, /*min*/0, /*sec*/0, /*milli*/0 )
...