Выбор только «месяца-дня» из поля «Дата и время» в SQL (сервер 2012) - PullRequest
0 голосов
/ 07 января 2019

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

Например, я хочу получить в выписке по делу любую дату, которая выпадает с 31/12 @ 23:59:00 на 01/01 @ 00:00:00, но если я не напишу кейс для включения в каждый год следующие 40 лет, чтобы покрыть себя, я не смог решить это.

Я пишу это из Великобритании с форматом даты дд / мм / гггг (приведенный выше пример - 31 декабря и 1 января).

Формат поля даты и времени в базе данных: «datetime»: 2019-07-01 13:14:47).

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Если я правильно понимаю, вы хотите округлить даты в последнюю минуту года до следующего. Вы можете сделать это:

SELECT datecol, CASE
    WHEN MONTH(datecol) = 12 AND DAY(datecol) = 31 AND CAST(datecol AS TIME(3)) >= '23:59:00' THEN CAST(DATEADD(MINUTE, 1, datecol) AS DATE)
    ELSE datecol
END
FROM (VALUES
    (CAST('2018-12-31 23:58:59.997' AS DATETIME)),
    (CAST('2018-12-31 23:59:00.000' AS DATETIME)),
    (CAST('2018-12-31 23:59:59.997' AS DATETIME)),
    (CAST('2019-01-01 00:00:00.000' AS DATETIME))
) AS v(datecol)

Результат:

2018-12-31 23:58:59.997    2018-12-31 23:58:59.997
2018-12-31 23:59:00.000    2019-01-01 00:00:00.000
2018-12-31 23:59:59.997    2019-01-01 00:00:00.000
2019-01-01 00:00:00.000    2019-01-01 00:00:00.000
0 голосов
/ 07 января 2019

Я не могу сказать, хотите ли вы, чтобы тип возвращаемого значения был date или datetime. Если date, вы можете сделать:

(case when year(dateadd(minute, 1, datecol)) <> year(datecol)
      then datefromparts(year(datecol) + 1, month(datecol), day(datecol))
      else cast(datecol as date)
 end)

Логика была бы аналогичной для datetime, предполагая, что datecol уже datetime:

(case when year(dateadd(minute, 1, datecol)) <> year(datecol)
      then datefromparts(year(datecol) + 1, month(datecol), day(datecol))
      else datecol
 end)
...