Преобразование даты и времени в varchar в хранимой процедуре SQL - PullRequest
0 голосов
/ 10 июля 2019

У меня есть хранимая процедура, которая ссылается на имена столбцов CycleStartedOn и CycleEndedOn.Оба этих столбца имеют типы данных datetime.Моя цель - конвертировать их в varchar(MAX).У меня есть переменные @CBFCycleStart и @CBFCycleEnd, содержащие эти значения.Код, который у меня есть, компилируется, но я не уверен, что делаю это неправильно или есть более эффективный и лучший способ достижения этой цели.Вот код, с которым я работаю:

DECLARE @CBFCycleStart as varchar(MAX)
DECLARE @CBFCycleEnd as varchar(MAX)

SELECT   
 @CBFCycleStart = (SELECT TOP 1 CONVERT(varchar(MAX), [CycleStartedOn], 120) FROM [IPEC_P_CIP_TKB_PREFLT] WHERE [CycleComplete] = '1' ORDER BY [CycleStartedOn] DESC)
 ,@CBFCycleEnd = (SELECT TOP 1 CONVERT(varchar(MAX), [CycleEndedOn], 120) FROM [IPEC_P_CIP_TKB_PREFLT] WHERE [CycleComplete] = '1' ORDER BY [CycleStartedOn] DESC)


 DECLARE @tblReports TABLE
(    
    CBFCycleStart varchar(MAX)
    ,CBFCycleEnd varchar(MAX)
)

INSERT INTO @tblReports
(    
    CBFCycleStart 
    ,CBFCycleEnd 
)

Values
(   
    @CBFCycleStart
    ,@CBFCycleEnd
)

SELECT * FROM @tblReports

END

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вы можете сэкономить один выбор, так как оба выбирают одну и ту же строку

SELECT TOP 1  @CBFCycleStart = CONVERT(varchar(MAX), [CycleStartedOn], 120) 
 ,@CBFCycleEnd = CONVERT(varchar(MAX), [CycleEndedOn], 120) 
 FROM [IPEC_P_CIP_TKB_PREFLT] 
 WHERE [CycleComplete] = '1' 
 ORDER BY [CycleStartedOn] DESC;
1 голос
/ 10 июля 2019

Вы могли бы немного упростить это так:

DECLARE @tblReports TABLE
(    
    CBFCycleStart varchar(MAX)
    , CBFCycleEnd varchar(MAX)
)

INSERT INTO @tblReports
(    
    CBFCycleStart 
    , CBFCycleEnd 
)

SELECT TOP 1
    CONVERT(varchar(MAX), [CycleStartedOn], 120)
    , CONVERT(varchar(MAX), [CycleEndedOn], 120)
FROM [IPEC_P_CIP_TKB_PREFLT]
WHERE [CycleComplete] = '1'
ORDER BY [CycleStartedOn] DESC

SELECT * FROM @tblReports

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

Редактировать

Если вам нужны переменные после INSERT, вы можете использовать:

DECLARE @CBFCycleStart as varchar(MAX)
DECLARE @CBFCycleEnd as varchar(MAX)

SELECT TOP 1
    @CBFCycleStart = CONVERT(varchar(MAX), [CycleStartedOn], 120)
    , @CBFCycleEnd = CONVERT(varchar(MAX), [CycleEndedOn], 120)
FROM [IPEC_P_CIP_TKB_PREFLT]
WHERE [CycleComplete] = '1'
ORDER BY [CycleStartedOn] DESC

DECLARE @tblReports TABLE
(    
    CBFCycleStart varchar(MAX)
    , CBFCycleEnd varchar(MAX)
)

INSERT INTO @tblReports
(    
    CBFCycleStart 
    , CBFCycleEnd 
)

VALUES
(
    @CBFCycleStart
    , @CBFCycleEnd
)

SELECT * FROM @tblReports
...