【问题标题】:SQL Server stored procedure - error converting data type varchar to datetimeSQL Server 存储过程 - 将数据类型 varchar 转换为 datetime 时出错
【发布时间】:2016-06-22 20:33:32
【问题描述】:

我有这个存储过程:

ALTER PROCEDURE [dbo].[PostScheduledTasks] 
    @actualStart datetime = NULL, 
    @actualFinish datetime = NULL,
    @actualEndDate datetime = NULL,
    @UserDate1 datetime = NULL,
    @IsCompleted bit = 0,
    @PercentComplete float = 0.0,
    @UStmp varchar(10) = NULL,
    @SchedukeTaskID int = 0,
    @SortOrder int = 0
AS
BEGIN
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    UPDATE ScheduleTasks  
    SET ActualStart = @actualStart,
        ActualFinish = @actualFinish,
        ActualEndDate = @actualEndDate,
        UserDate1 = @UserDate1,
        IsCompleted = @IsCompleted,
        PercentComplete = @percentComplete,
        UStmp = @UStmp
    WHERE 
        ScheduleTaskID = @SchedukeTaskID
        AND SortOrder = @SortOrder
END

当我尝试执行它时:

DECLARE @return_value int

EXEC    @return_value = [dbo].[PostScheduledTasks]
        @actualStart = N'08-03-2016 8:00:00 AM',
        @actualFinish = N'08-03-2016 4:00:00 PM',
        @actualEndDate = N'08-03-2016 4:00:00 PM',
        @UserDate1 = N'27-01-2016 8:00:00 AM',
        @IsCompleted = 1,
        @PercentComplete = 1,
        @UStmp = N'jsuske',
        @SchedukeTaskID = 597295,
        @SortOrder = 19

SELECT  'Return Value' = @return_value
GO

我得到这个错误:

将数据类型 varchar 转换为 datetime 时出错。

【问题讨论】:

  • 检查您的 ScheduleTasks 表以确保 ActualStart、ActualFinish 和 ActualEndDate 实际上是数据库中的日期时间列。
  • 它在N'27-01-2016 8:00:00 AM' 条目上失败——当您使用 12 小时时间时,SQL 服务器可能期望 MM/dd,而不是 dd-MM

标签: sql sql-server tsql datetime stored-procedures


【解决方案1】:

最安全的方法是将日期提供为ISO 8601,这与文化无关:

yyyy-mm-ddThh:mm:ss[.mmm]

使用 ISO 8601 格式的优势在于它是一个国际标准。此外,使用此格式指定的日期时间值是明确的。此外,此格式不受 SET DATEFORMAT 或 SET LANGUAGE 设置的影响。

DECLARE @return_value int

EXEC    @return_value = [dbo].[PostScheduledTasks]
        @actualStart     = N'2016-03-08T08:00:00',
        @actualFinish    = N'2016-03-08T16:00:00',
        @actualEndDate   = N'2016-03-08T16:00:00',
        @UserDate1       = N'2016-01-27T08:00:00',
        @IsCompleted     = 1,
        @PercentComplete = 1,
        @UStmp           = N'jsuske',
        @SchedukeTaskID  = 597295,
        @SortOrder       = 19

SELECT  'Return Value' = @return_value

或者您必须检查SET LANGUAGE/DATEFORMAT 并以正确的格式提供日期。

【讨论】:

  • @user979331 请再试一次,第一个版本在小时之前没有 0。我打错了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多