首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL过程失败,原因是Varchar转换为DateTime错误

SQL过程失败,原因是Varchar转换为DateTime错误
EN

Stack Overflow用户
提问于 2011-10-21 17:27:13
回答 1查看 1.8K关注 0票数 1

我有一个我写的存储过程的问题,我可以在management studio中调用它,它工作得很好,但是当我调用da.Fill(dt)时,从我的代码后台调用它时会出现这个错误The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

这里真正让我困惑的是,我实际上并没有将任何东西从varchar转换成日期时间,我对日期变量所做的最多的事情就是将它们格式化为不同的日期时间格式。

我的VB.Net代码

代码语言:javascript
运行
复制
  Private Function dbGetEvents(ByVal start As DateTime, ByVal days As Integer) As DataTable
      Dim dt As New DataTable()

      Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString())

      Dim cmd As New SqlCommand
      cmd.CommandType = CommandType.StoredProcedure
      cmd.CommandText = "spGetEventDetails"
      cmd.Parameters.AddWithValue("@start", start)
      cmd.Parameters.AddWithValue("@end", start.AddDays(days))
      cmd.Parameters.AddWithValue("@userid", ddlUser.SelectedValue)

      cmd.Connection = conn

      Using da As New SqlDataAdapter(cmd)
         conn.Open()
         da.Fill(dt)
         conn.Close()
      End Using

      Return dt
   End Function

我的SQL过程:

代码语言:javascript
运行
复制
CREATE PROCEDURE spGetEventDetails
(
    @start AS DATETIME,
    @end AS DATETIME,
    @userid AS INT
)
AS
BEGIN

SET @start = CONVERT(CHAR(10), CAST(@start AS DATETIME), 23)
SET @end = CONVERT(CHAR(10), CAST(@end AS DATETIME), 23)

    -- GET DETAILS FOR TICKETS
    SELECT
        [ev].[id]                           AS [EventID],
        CAST([tck].[TicketID] AS NVARCHAR)  AS [TicketID],
        [tck].[Description]                 AS [Description],
        [ev].[eventstart]                   AS [Start],
        [ev].[eventend]                     AS [End],
        [ev].[status]                       AS [Status],
        [ev].[type]                         AS [EventType],
        CAST([tck].[Type] AS NVARCHAR)      AS [Type],
        CAST([tck].[Product] AS NVARCHAR)   AS [Product],
        CAST([tck].[Severity] AS NVARCHAR)  AS [Severity],
        [ev].[resource_id]                  AS [resource_id],
        CAST(pers.FirstName AS NVARCHAR)    AS [FirstName],
        CAST(pers.Surname AS NVARCHAR)      AS [Surname],
        CAST(tck.LogDate AS NVARCHAR)       AS [LogDate]
    FROM
        tblSupportEvent ev
    JOIN
        tblTicketsInEvents tie
    ON
        ev.id =tie.eventID
    JOIN
        SupportTicketsTbl tck
    ON
        tie.ticketID = tck.TicketID 
    JOIN 
        PersonnelTbl pers
    ON
        pers.ID = tck.LoggedBy 
    WHERE
        ev.type = 1
    AND 
        NOT (([eventend] <= @start) OR ([eventstart] >= @end))  
    AND  
        resource_id <> 0  
    AND   
        ev.resource_id = @userid  

UNION 
    -- GET THE DETAILS FOR NON TICKET ITEMS

    SELECT
        [ev].[id]           AS [EventID],
        ''                  AS [TicketID],
        [nti].[Description] AS [Description],
        [ev].[eventstart]   AS [Start],
        [ev].[eventend]     AS [End],
        [ev].[status]       AS [Status],
        [ev].[type]         AS [EventType],
        ''                  AS [Type],
        ''                  AS [Product],
        ''                  AS [Severity],
        [ev].[resource_id]  AS [resource_id],
        ''                  AS [FirstName],
        ''                  AS [Surname],
        ''                  AS [LogDate]
    FROM
        tblSupportEvent ev
    JOIN
        tblNonTicketsInEvents nte
    ON
        ev.id = nte.eventID 
    JOIN
        tblNonTicketItems nti
    ON
        nte.nonTicketID = nti.id    
    WHERE
        ev.type = 2
    AND
        NOT (([eventend] <= @start) OR ([eventstart] >= @end))  
    AND  
        resource_id <> 0  
    AND   
        ev.resource_id = @userid  
END

我看不出这个错误可能来自哪里,在SQL management studio中测试运行它没有错误,我非常确定错误是在VB中。

我的第一个想法是,也许我在@start / @end值中传递的参数没有被识别为DateTime,所以我尝试添加如下参数:

代码语言:javascript
运行
复制
 Dim p As New SqlParameter

  p.SqlDbType = SqlDbType.DateTime
  p.ParameterName = "@start"
  p.Value = start
  cmd.Parameters.Add(p)

但这只给了我相同的结果。如果有人能指出我哪里做错了,我将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-21 17:47:41

登录的语言可能不同。

代码语言:javascript
运行
复制
set dateformat mdy

declare @start datetime = '20110130'

SET @start = CONVERT(CHAR(10), CAST(@start AS DATETIME), 23)

很管用。但是set dateformat dmy没有。

要提取datetimedate部分,可以使用DATEADD(DAY,DATEDIFF(DAY,0,@start),0)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7847447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档