Возврат (Cast? Convert?) Значений в качестве DateTIme из запроса "Различный год, месяц" в процедуре хранения - PullRequest
1 голос
/ 22 мая 2011

У меня есть база данных с таблицей Publications, которая может быть присоединена к iself через таблицу SubPublications.

Моя хранимая процедура возвращает все отдельные комбинации года и месяца из поля ReleaseDate Publicationsуказанный тип, который не связан с конкретной публикацией (по идентификатору) (отсюда 2 параметра, см. ниже).

ВОПРОС:
Процесс работает нормально, но я хочу, чтобы тип возвращаемого столбца был DateTime2 с фиктивной датой 1. Как сейчас, он возвращает 2 столбца целых чисел. Как мне это сделать?

Я знаю, что могу выполнить преобразование в коде моего приложения, но я бы предпочел, чтобы оно доставлялось как дата / время из БД.

Мой SQL не очень хорош.Я даже не знаю, должен ли я использовать приведение или преобразование.

Я не могу найти в Интернете пример преобразования назад к дате и времени в таком запросе.Кто-нибудь может помочь?Вот прок, который я написал, в том виде, в каком он стоит:

ALTER PROCEDURE sp_DistinctPubMonthYears 
    @PubType char(1),
    @PubId int = 0      
AS
BEGIN
SELECT 
    DISTINCT TOP (100) PERCENT 
        DATEPART(month, ReleaseDate) AS month, 
        DATEPART(year, ReleaseDate) AS year         
    FROM(         
        SELECT 
            Publications.ReleaseDate AS ReleaseDate,
            Publications.PublicationId As PubId,
            Publications.PubType AS PubType,
            SubPublications.PublicationId AS ParentId
        FROM 
            Publications LEFT JOIN SubPublications
        ON 
            Publications.PublicationId = SubPublications.PublicationId 
        WHERE
            Publications.PubType = @PubType AND
            Publications.PublicationId <> @PubId AND
            (
                SubPublications.PublicationId <> @PubId OR  
                /*either it's parent is NOT the one we're searching on or */
                SubPublications.PublicationId IS NULL  
                /*or it's not joined to anything at all */
            )               
    ) AS sub
ORDER BY year ASC, month ASC 
END
GO

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Вам не нужен TOP, и вы также можете ЗАКАЗАТЬ по выражению.

Это выражение DATEADD / DATEDIFF даст вам начало текущего месяца

SELECT DISTINCT
    CAST(
      DATEADD(month, DATEDIFF(month, 0, ReleaseDate), 0) AS datetime2
    ) AS myCol 
FROM(         
...
ORDER BY
    DATEADD(month, DATEDIFF(month, 0, ReleaseDate), 0)

Редактировать: Как упоминал Фауст, мы можем заказать псевдоним, если вы предпочитаете.

...
ORDER BY
    myCol

В этом случае результат тот же.

Если бы CAST был varchar, то у вас были бы другие результаты. Вот почему я склонен использовать выражение, а не псевдоним, но это довольно тривиально. Конечно, я бы проверил свои изменения ..., нет?

1 голос
/ 22 мая 2011

DATEADD(MONTH, DATEDIFF(MONTH, '1600-01-01T00:00:00', ReleaseDate), '1600-01-01T00:00:00') вы получите дату yyyy-MM-dd 00:00:00. 1600-01-01T00: 00: 00 - это произвольная дата, которую лучше выбрать до любых дат, которые вы можете сохранить в столбце ReleaseDate.

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