gpt4 book ai didi

sql-server-2008 - 在过程中输入日期时间作为输入参数

转载 作者:行者123 更新时间:2023-12-03 21:18:15 25 4
gpt4 key购买 nike

我已经使用这种结构创建了一个过程,但是对于datetime输入参数不起作用

我执行了这个查询,但是

declare @a datetime
declare @b datetime

set @a='2012/04/06 12:23:45'
set @b='2012/08/06 21:10:12'

exec LogProcedure 'AccountLog', N'test', @a, @b


但是SQL Server让我这个错误


从字符串转换日期和/或时间时转换失败。


但是当我使用此查询进行测试时

  exec LogProcedure 'AccountLog',N'test'


存储过程代码:

alter PROCEDURE LogProcedure
@TableName VARCHAR(60),
@SearchString NVARCHAR(50),
@DateFirst DateTime = '',
@DateLast DateTime = ''
AS
BEGIN
SET NOCOUNT ON

DECLARE @FinalSQL NVARCHAR(MAX)

SET @FINALSQL = 'SELECT * FROM [' + @TableName + '] where 1=2 '

IF @DateFirst <> '' and @DateLast <> ''
set @FinalSQL = @FinalSQL + ' or convert (Date,DateLog) >= '''+@DateFirst + ' and convert (Date,DateLog) <='''+@DateLast

SELECT
@FinalSQL = @FinalSQL + ' or [' + SYSCOLUMNS.NAME + '] LIKE N''%' + @SearchString + '%'' '
FROM SYSCOLUMNS
WHERE OBJECT_NAME(id) = @TableName
AND TYPE_NAME(SYSCOLUMNS.XTYPE) IN ('VARCHAR','NVARCHAR','CHAR','NCHAR','INT','DECIMAL')
ORDER BY COLID

EXEC(@FinalSQL)
END


这个查询也是如此

SELECT * 
FROM AccountLog
where 1=2 or convert (Date, DateLog) >= '2012/04/06'
and convert (Date, DateLog) <='2012/08/06'

最佳答案

您应该将ISO-8601格式用于日期的字符串表示形式-其他任何内容都取决于SQL Server语言和dateformat设置。

仅使用日期时,DATETIME的ISO-8601格式为:YYYYMMDD(无破折号或Antyhing!)

对于带有时间部分的DATETIME,它是YYYY-MM-DDTHH:MM:SS(带短划线,中间是T,用于分隔日期和时间部分)。

如果要将SQL Server 2008或更高版本的字符串转换为DATE,则可以使用YYYY-MM-DD(带短划线)获得相同的结果。而且不要问我为什么这是如此不一致和令人困惑-就是如此,您现在必须使用它。

因此,在您的情况下,您应该尝试:

declare @a datetime
declare @b datetime

set @a = '2012-04-06T12:23:45' -- 6th of April, 2012
set @b = '2012-08-06T21:10:12' -- 6th of August, 2012

exec LogProcedure 'AccountLog', N'test', @a, @b


此外,由于将 datetime和字符串连接在一起成为字符串,所以存储的proc存在问题,但是您没有先将 datetime转换为字符串,而且,您忘记了语句中的引号在两个日期之后。

因此,将此行更改为此:

IF @DateFirst <> '' and @DateLast <> ''
SET @FinalSQL = @FinalSQL + ' OR CONVERT(Date, DateLog) >= ''' +
CONVERT(VARCHAR(50), @DateFirst, 126) + -- convert @DateFirst to string for concatenation!
''' AND CONVERT(Date, DateLog) <=''' + -- you need closing quotes after @DateFirst!
CONVERT(VARCHAR(50), @DateLast, 126) + '''' -- convert @DateLast to string and also: closing tags after that missing!


使用这些设置,并且一旦修复了包含问题的存储过程,它就可以正常工作。

关于sql-server-2008 - 在过程中输入日期时间作为输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10061665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com