将日期参数从crystal传递到存储过程,然后在where子句中转换为decimal

时间:2015-08-12 13:06:15

标签: sql stored-procedures crystal-reports

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

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

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

*我已尝试将其作为varchar,substring和numeric之前的版本 - 不适合我 - 所以如果你能尽可能具体,或者提供一个我应该如何做的例子我会非常感激它。

2 个答案:

答案 0 :(得分:0)

您不仅可以将日期转换为小数。首先,您必须进行某种转换才能将其转换为数字。可能使用DateDiff()。例如,如果小数REALLY表示的是自纪元以来的秒数,则需要执行此操作:

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

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

答案 1 :(得分:0)

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

*下面使用的命名约定似乎很愚蠢,但我这样做是因为我重写了一个基于水晶表的报告,我不想从头开始,所以我命名字段很容易识别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')