【问题标题】:SQL: converting datetime from character string when inserting dateSQL:插入日期时从字符串转换日期时间
【发布时间】:2013-01-25 09:48:22
【问题描述】:

我有以下程序:

ALTER PROCEDURE [dbo].[myProcedute]
    @mydate VARCHAR(8000) = NULL

IF @mydate = ''
        BEGIN
            SET @mydate = NULL
        END
        ELSE 
        BEGIN
        SET @mydate = CONVERT(DATETIME, @mydate, 103) -- dd/mm/yy
        END

    INSERT INTO  dbo.myTable(theDate) VALUES(@mydate)

我是这样执行的:

EXEC  [dbo].[myProcedure] '02/02/2012'

执行后我得到这个错误: 从字符串转换日期时间时转换失败。

我从我的 vb6 代码执行它,日期可能会有所不同。这次是 '02/02/2012' 但下一次可能是 ''(空)。

当它作为 '' 出现时,我需要它插入一个 NULL,正如您在 IF 子句中看到的那样。

为什么会出现此错误?

非常感谢!

【问题讨论】:

  • 为什么不把@mydate的定义改成DATE呢?
  • 试试 IF LTRIM(@mydate) = ''
  • 我建议 TO_DATE(LTRIM(@mydate),'DD/MM/YY')
  • 将其作为datetime 传递会节省很多问题。
  • @Luv - VB6 表示 ADO 经典,我认为 2008 年的类型从未更新过。

标签: sql datetime stored-procedures type-conversion


【解决方案1】:

使用 ISDATE() 检查它是否是有效日期。

转换似乎很好。正如 cmets 所建议的那样,如果您可以将参数更改为DATE,它将解决很多问题

ALTER PROCEDURE [dbo].[myProcedute]
    @mydate VARCHAR(8000) = NULL

IF ISDATE(@mydate)
    BEGIN
        SET @mydate = CONVERT(DATETIME, @mydate, 103) -- dd/mm/yy
    END
    ELSE 
    BEGIN
        SET @mydate = NULL        
    END

INSERT INTO  dbo.myTable(theDate) VALUES(@mydate)

【讨论】:

    【解决方案2】:

    最好将您的日期字符串格式化为 ISO 格式 (yyyymmdd),这样可以保证在任何 sql-server 上工作。假设您的 vb 代码像 dd/mm/yyyy 一样传递它(根据您的数据)。试试这个;

    --Format @mydate to yyyymmdd
    SELECT @mydate = CASE LEN(@mydate) WHEN 10 
             THEN RIGHT(@mydate,4)+ SUBSTRING(@mydate,4,2)+ LEFT(@mydate,2)
             ELSE NULL END
    --Insert
    INSERT INTO  dbo.myTable(theDate) VALUES(@mydate)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2017-10-15
      • 2015-09-17
      • 2013-02-24
      • 2014-09-26
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多