Установите конкретную дату и время в sp - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь установить определенный диапазон дат в хранимой процедуре, моя начальная дата должна всегда читать вчерашнюю дату с часами, установленными на 23:00:00, поэтому полная дата и метка времени должны иметь значение 2018-06-11 23:00:00, а моя дата окончания должнавсегда читайте сегодняшнюю дату с отметкой времени на 22:59:59, поэтому полная отметка даты и времени должна читаться как 2018-06-12 22:59:59, может ли кто-нибудь помочь мне в достижении этого?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Другой вариант - конкатенация строк:

WITH Today(ISO8601) AS (SELECT CONVERT(VARCHAR(10),GETDATE(),126)) --create an ISO8601-string
SELECT DATEADD(DAY,-1,CAST(ISO8601 + 'T23:00:00' AS DATETIME)) AS Yesterday11pm
       ,CAST(ISO8601 + 'T22:59:59' AS DATETIME) AS TodayEndOfday
FROM Today

CTE создаст строку даты ISO8601, например "2018-06-12".Запрос добавляет время (с T в качестве разделителя) и приводит к DATETIME.Вчера достигается путем добавления минус 1 день.

ОБНОВЛЕНИЕ

Говоря о добавлении полных дней, вы можете заменить DATEADD на простой -1, но яне рекомендовал бы такой подход:

WITH Today(ISO8601) AS (SELECT CONVERT(VARCHAR(10),GETDATE(),126)) --create an ISO8601-string
SELECT  CAST(ISO8601 + 'T23:00:00' AS DATETIME)-1 AS Yesterday11pm
       ,CAST(ISO8601 + 'T22:59:59' AS DATETIME) AS TodayEndOfday
FROM Today

Если вам не нравится подход CTE, вы можете обойтись без:

SELECT  CAST(CONVERT(VARCHAR(10),GETDATE(),126) + 'T23:00:00' AS DATETIME)-1 AS Yesterday11pm
       ,CAST(CONVERT(VARCHAR(10),GETDATE(),126) + 'T22:59:59' AS DATETIME) AS TodayEndOfday
0 голосов
/ 12 июня 2018

Еще один вариант (если 2012+) - добавить желаемое время в строку формата

Пример

Select  Date1 = format(GetDate()-1,'yyyy-MM-dd 23:00:00')
       ,Date2 = format(GetDate()-0,'yyyy-MM-dd 22:59:59')

Возвращает

Date1                 Date2
2018-06-11 23:00:00   2018-06-12 22:59:59

Обратите внимание: Format() обладает отличной функциональностью, но, как известно, не является исполнителем.

0 голосов
/ 12 июня 2018

Использование DATETIMEFROMPARTS:

SELECT
    Now = GETDATE(),
    ForcedYesterday = DATETIMEFROMPARTS(
        YEAR(GETDATE() - 1),
        MONTH(GETDATE() - 1),
        DAY(GETDATE() - 1),
        23, -- Hour
        0, -- Minute
        0, -- Second
        0), -- Milliseconds
    ForcedToday = DATETIMEFROMPARTS(
        YEAR(GETDATE()),
        MONTH(GETDATE()),
        DAY(GETDATE()),
        22, -- Hour
        59, -- Minute
        59, -- Second
        0) -- Milliseconds

Использование DATEDIFF:

SELECT
    Now = GETDATE(),
    ForcedYesterday = DATEDIFF(DAY, 0, GETDATE() - 1) + CONVERT(DATETIME, '23:00:00.000'),
    ForcedToday = DATEDIFF(DAY, 0, GETDATE()) + CONVERT(DATETIME, '22:59:59.000')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...