将sql参数更改为日期小数

将sql参数更改为日期小数,sql,database,crystal-reports,db2,Sql,Database,Crystal Reports,Db2,我在crystal reports中有一个SQL命令(如果您不熟悉crystal,则可以),我需要将日期参数转换为十进制(以匹配数据库中的列) 如果我在上述查询中使用强制转换,它将不起作用: SELECT decimaldate FROM TABLE1 WHERE decimaldate = CAST(CAST{?normaldate} AS VARCHAR) AS DECIMAL) 试试这样的 select CAST(replace(convert(varchar, getdate(),

我在crystal reports中有一个SQL命令(如果您不熟悉crystal,则可以),我需要将日期参数转换为十进制(以匹配数据库中的列)

如果我在上述查询中使用强制转换,它将不起作用:

SELECT decimaldate FROM TABLE1 WHERE decimaldate =
 CAST(CAST{?normaldate} AS VARCHAR) AS DECIMAL)

试试这样的

 select CAST(replace(convert(varchar, getdate(), 101), '/', '') AS DECIMAL)
或者类似的地方@normaldate是搜索日期

SELECT decimaldate FROM TABLE1 WHERE decimaldate = CAST(replace(convert(varchar, @normaldate, 101), '/', '') AS DECIMAL)

我建议在公式中创建一个公式(称为@decimaldate)来保存日期参数的等效数值,因此它类似于:

year({?normaldate})*10000 + month({?normaldate})*100 + day({?normaldate})
-然后修改您的选择标准,根据您的新公式进行选择-如下所示:

SELECT decimaldate FROM TABLE1 WHERE decimaldate = {@decimaldate}

这个DB2SQL函数执行查询所需的从日期到MDY的十进制转换。创建后,查询可以将包含MDY日期的十进制列与UTIL.to_decimal_MDY(someValidDate)的输出进行比较

我想这就是你想要的:

SELECT decimaldate
  FROM table1
 WHERE decimaldate = VARCHAR_FORMAT(@NormalDate, 'MMDDYYY')

您可能需要将
@NormalDate
包装为
DATE()
以将其转换为日期类型(取决于您的输入格式)。

它在crystal中,crystal使用SQL,即使数据源是db2DB2是否有
DatePart
函数?可能,但我在crystal中使用SQL,那么我必须使用DB2命令吗?@user719825:十进制数据是如何存储在数据库中的?是从纪元日期(类似于Unix日期戳)、传统日期的8位音译(如今天的20121220)还是其他方式开始的时间?我们还需要了解十进制类型如何表示日期?例如,
0.0
表示
01-01-1970 00:00:00.000
0.5
表示
01-01-1970 12:00:00.000
?在不知道编码方法的情况下,我们无法确保给您准确的答案。[这段话是@MarkBannister,他刚才也问了一个类似的问题。]我得到一个错误:语句结尾无效。它是否应该是在SQL Server中工作,但不确定在crystal reports中是否正确翻译的101以外的东西。101是有效的数据格式。试试这个->选择convert(varchar,getdate(),101)。如果可以的话,它不喜欢replace语句。它应该是{?normaldate},而不是{@normaldate}。确保在命令对象中也创建参数。这是一个很好的函数。根据decimaldate列的数据类型,您可能还需要将VARCHAR_FORMAT()调用的输出转换为DECIMAL类型。
CREATE OR REPLACE FUNCTION util.to_decimal_mdy(dateval DATE)
LANGUAGE SQL
RETURNS DECIMAL(9,0)
RETURN MONTH(dateval) * 10000000 + DAY(dateval) * 100000 + YEAR(dateval)
;
SELECT decimaldate
  FROM table1
 WHERE decimaldate = VARCHAR_FORMAT(@NormalDate, 'MMDDYYY')