【问题标题】:Pass date parameter from crystal into stored procedure then convert to decimal in where clause将日期参数从水晶传递到存储过程,然后在 where 子句中转换为十进制
【发布时间】:2015-08-12 13:06:15
【问题描述】:

我有一个 Crystal Report,我已经重写为使用存储过程而不是多个不同的表。该报告基于日期参数。我将在我的存储过程的 where 子句中比较它的实际值是小数。

我的问题是:在我将 Crystal 中的日期参数传递到存储过程之后 - 我如何将此日期值转换为十进制格式,以便我可以过滤此字段。 (SQL)

补充信息:该值采用十进制格式,因为 Sage Software 以这种方式创建其日期字段。

*我之前尝试过强制转换为 varchar、子字符串和数字 - 不适合我 - 所以如果你能尽可能具体或提供我应该如何执行此操作的示例,我将不胜感激它。

【问题讨论】:

  • 十进制表示是秒吗?
  • .00 始终是十进制值
  • 我认为这可能是票,但我仍在使用它:
  • (FROMDATE SMALLDATETIME, -- = '2015-06-28' TODATE SMALLDATETIME) --= '2015-07-04' 声明为十进制 (9,0) 声明为十进制( 9,0) 设置自 = CAST(STR(DATEPART(YEAR, FROMDATE),4) + REPLACE(STR(DATEPART(MONTH, FROMDATE), 2), ' ', '0') + REPLACE(STR(DATEPART(DAY) , FROMDATE), 2), ' ', '0') AS DECIMAL(9,0)) 设置为 = CAST(STR(DATEPART(YEAR, TODATE),4) + REPLACE(STR(DATEPART(MONTH, TODATE), 2), ' ', '0') + REPLACE(STR(DATEPART(DAY, TODATE), 2), ' ', '0') AS DECIMAL(9,0)) 其中 UPH.TRANSDATE >= FROM AND UPH。转

标签: sql stored-procedures crystal-reports


【解决方案1】:

您不仅可以将日期转换为小数。首先,您必须进行某种转换才能将其转换为数字。可能通过使用DateDiff()。例如,如果该小数真正代表的是自纪元以来的秒数,则您需要这样做:

DateDiff("s", #1/1/1970#, parameter)

然后,您可以从DateDiff() 获取输出并将其转换为小数。但是从日期转换为小数是不可能的。一个是复杂的数据结构,另一个是基类型。

【讨论】:

  • 经过我们两位 DBA 的大力尝试和帮助 - 以下是我们如何解决问题的副本 - 以防其他人可能会感激知道:
【解决方案2】:

以下是我们提出的解决方案 - 分享给其他可能受益的人。

*下面使用的命名约定似乎很愚蠢,但我这样做是因为我正在重写基于水晶表的报告,并且我不想从头开始,所以我命名了在 proc 中易于识别的字段,并且使用“设置数据源位置”来更新每个表以使用存储的 proc 字段 - 这样可以节省大量时间!

( @FROMDATE SMALLDATETIME, -- = '2015-06-28'
 @TODATE SMALLDATETIME) --= '2015-07-04'

 --@FROMDATE DECIMAL(9,0),
 --@TODATE DECIMAL(9,0) 
AS
--SET DECLARATIONS
DECLARE @FROM AS DECIMAL(9,0)
DECLARE @TO AS DECIMAL(9,0)

--SET VARIABLES
SET @FROM = CAST(STR(DATEPART(YEAR, @FROMDATE),4) + REPLACE(STR(DATEPART(MONTH, @FROMDATE), 2), ' ', '0') + REPLACE(STR(DATEPART(DAY, @FROMDATE), 2),     ' ', '0') AS DECIMAL(9,0))
SET @TO = CAST(STR(DATEPART(YEAR, @TODATE),4) + REPLACE(STR(DATEPART(MONTH, @TODATE), 2), ' ', '0') + REPLACE(STR(DATEPART(DAY, @TODATE), 2), ' ', '0') AS DECIMAL(9,0))

BEGIN
 --SET NOCOUNT ON added to prevent extra result sets from
 --interfering with SELECT statements.
 SET NOCOUNT ON;

 --Insert statements for procedure here
SELECT 
UPH.TRANSDATE,
@from,
@to,
@FROMDATE,
@TODATE,
UPD.[EMPLOYEE] as 'UPCHKD.EMPLOYEE'
,UPD.EXPACCT AS 'UPCHKD.EXPACCT'
,SUBSTRING(UPD.EXPACCT, 6,2) LEXPACCT
,GL.ACCTFMTTD AS 'GLAMF.ACCTFMTTD'
,GL.ACCTDESC AS 'GLAMF.ACCTDESC'
,UPD.EARNDED AS 'UPCHKD.EARNDED'
,UPD.EARDEDTYPE AS 'UPCHKD.EARDEDTYPE'
,UPD.EEXTEND AS 'UPCHKD.EEXTEND'
,UPD.[HOURS] AS 'UPCHKD.HOURS'
,UPD.LINETYPE AS 'UPCHKD.LINETYPE'
,UPD.PEREND AS 'UPCHKD.PEREND'
,UPH.CHECKSTAT AS 'UPCHKH.CHECKSTAT'
,UPH.TRANSDATE AS 'UPCHKH.TRANSDATE'
,UPT.SHIFTACCT AS 'UPDIST.SHIFTACCT'
,UPE.FULLNAME AS 'UPEMPL.FULLNAME'
,UPD.[ENTRYSEQ] AS 'UPCHKD.ENTRYSEQ'


FROM [ISSDAT].[dbo].[UPCHKD] UPD
  LEFT JOIN [ISSDAT].[dbo].[GLAMF] GL ON UPD.EXPACCT = GL.ACCTFMTTD
  LEFT JOIN [ISSDAT].[dbo].[UPCHKH] UPH ON UPD.EMPLOYEE = UPH.EMPLOYEE AND      UPD.ENTRYSEQ = UPH.ENTRYSEQ AND UPD.PEREND = UPH.PEREND 
  LEFT JOIN [ISSDAT].[dbo].[UPEMPL] UPE ON UPE.EMPLOYEE = UPD.EMPLOYEE
  LEFT JOIN [ISSDAT].[dbo].[UPDTLM] UPM ON UPM.EARNDED = UPD.EARNDED
  LEFT JOIN [ISSDAT].[dbo].[UPDIST] UPT ON UPT.EARNDED = UPD.EARNDED AND UPT.EXPACCT = UPD.EXPACCT 
  where UPH.CHECKSTAT <> '4' AND UPH.TRANSDATE >= @FROM AND UPH.TRANSDATE < @TO 
  AND UPD.EEXTEND > 0.00 AND UPD.[HOURS] > 0.00 AND UPD.EXPACCT NOT LIKE '66400%' 
    AND substring(UPD.EXPACCT, 6,2) IN ('-1', '-2', '-3', '-4', '-5', '-6', '-7')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多