存储过程日期时间无效的列名

时间:2019-11-26 23:19:18

标签: sql-server tsql date datetime

我正在尝试获取日期时间查询以在存储过程中工作,但我尝试的所有方法均无效。

要么我收到错误消息,要么得到我没想到的结果,例如未考虑查询语句。

这是我要查询的数据库列中的值格式:

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

现在我在堆栈跟踪中得到此错误

  

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

enter image description here

1 个答案:

答案 0 :(得分:3)

  1. 使用正确的日期类型,即datedatetime2(建议在datetime2上使用datetime
  2. 除非绝对必要,否则请不要使用动态SQL,根据提供的信息,此处不是这种情况。

重新编写过程将给出:

    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'