我正在尝试获取日期时间查询以在存储过程中工作,但我尝试的所有方法均无效。
要么我收到错误消息,要么得到我没想到的结果,例如未考虑查询语句。
这是我要查询的数据库列中的值格式:
2019-10-22 02:09:04.953
如果我在SQL Server中打开一个新查询,并手动编写该查询,它将运行良好,并且在给定日期之后得到结果:
SELECT TOP 100 *
FROM [Test].[dbo].[Order]
WHERE [CreatedOnUtc] > '10/15/2019 13:30:00.000'
ORDER BY [CreatedOnUtc]
CreatedOnUtc
的数据类型为datetime
在我的代码中,我尝试了很多操作,例如添加区域性信息,用于格式化的字符串以及将日期时间传递到数据库而不是字符串:
var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd HH:mm:ss.fff");
var createFromDate = createdFromUtc.Value.ToString("yyyy/MM/dd HH:mm:ss.fff");
var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd");
var createFromDate = createdFromUtc.Value.ToString("yyyy/MM/dd");
这是我的存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
@CreatedFromUtc NVARCHAR(MAX) = NULL,
@CreatedToUtc NVARCHAR(MAX) = NULL
AS
BEGIN
DECLARE @sql NVARCHAR(MAX)
SET NOCOUNT ON;
SET @sql = 'SELECT TOP 100 *
FROM [Test].[dbo].[Order] o WIT H(NOLOCK) '
SET @sql = @sql + 'WHERE o.Deleted = 0'
BEGIN
SET @sql = @sql + '
AND o.CreatedOnUtc BETWEEN "' + CAST(@CreatedFromUtc AS nvarchar(max)) + '" AND "' + CAST(@CreatedToUtc AS nvarchar(max)) + '"' -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 126 ) -- -- -- + CAST(@CreatedFromUtc AS datetime) -- + CAST(@CreatedFromUtc AS nvarchar(max)) -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 101 ) -- + CAST(@CreatedFromUtc AS nvarchar(max)) --
END
EXEC sp_executesql @sql
END
我在存储过程中留下了一些注释掉的代码,因此您可以看到我尝试了其他事情。真的不确定我在哪里出问题了。
更新
我更改了存储过程以使用日期时间,并像这样更新了我的代码,但仍然无法正常工作。
@CreatedFromUtc DATETIME = NULL // new parameter declaration
BEGIN
SET @sql = @sql + '
AND o.CreatedOnUtc > ' + Convert(datetime, @CreatedFromUtc, 101 ) + '' -- AND "' + CAST(@CreatedToUtc AS nvarchar(max)) + '"' -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 126 ) -- -- -- + CAST(@CreatedFromUtc AS datetime) -- + CAST(@CreatedFromUtc AS nvarchar(max)) -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 101 ) -- + CAST(@CreatedFromUtc AS nvarchar(max)) --
END
在查询中我也尝试使用CAST(@CreatedFromUtc AS datetime)
,但仍然无法正常工作。
在我的C#代码中,我可以确认var为datetime
。
现在我在堆栈跟踪中得到此错误
从字符串转换日期和/或时间时转换失败
答案 0 :(得分:3)
date
或datetime2
(建议在datetime2
上使用datetime
)重新编写过程将给出:
ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
(
-- check that the precision matches your needs
@CreatedFromUtc datetime2(0)
, @CreatedToUtc datetime2(0)
)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 100 *
FROM [Test].[dbo].[Order]
-- Check the >=, < logic is correct for your purposes
WHERE [CreatedOnUtc] >= @CreatedFromUtc
AND [CreatedOnUtc] < @CreatedToUtc
ORDER BY [CreatedOnUtc];
RETURN 0;
END
exec [dbo].[OrderLoadAllPaged] '2019-10-15 13:30:00.000', '2019-10-16 13:30:00.000'