在SQL存储过程中将datetime转换为varchar

时间:2019-07-10 12:25:56

标签: sql sql-server reporting-services ssrs-2012

我有一个存储过程,该存储过程引用列名的CycleStartedOnCycleEndedOn。这些列都是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 个答案:

答案 0 :(得分:1)

您可以将其简化如下:

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

答案 1 :(得分:1)

您可以保留一个选择,因为两个都选择同一行

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;