【问题标题】:Converting datetime to varchar in SQL Stored Procedure在 SQL 存储过程中将 datetime 转换为 varchar
【发布时间】:2019-07-10 12:25:56
【问题描述】:

我有一个引用列名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

【问题讨论】:

  • 如果目标是 @tblReports 为什么需要中间变量?它们是否在过程中的其他地方使用?
  • 我在单独的 SSRS 报告中使用“@CBFCycleStart”和“@CBFCycleEnd”。这些变量有助于我的 SSRS 报告。

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


【解决方案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

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多