【问题标题】:datetime argument data type varchar is invalid for argument 3 of convert functiondatetime 参数数据类型 varchar 对 convert 函数的参数 3 无效
【发布时间】:2015-12-06 17:38:15
【问题描述】:

我正在尝试使用以下内容填充数据库中的表:

INSERT INTO student 
VALUES (102, 'Mr.', 'Fred', 'Crocitto', '101-09 120th St.', '11419', '718-555-5555', 
        'Albert Hildegard Co.', '22-JAN-03', 'BROSENZWEIG',
        CONVERT(DATETIME, '19-JAN-2007 00:00: 00','DD-MON-YYYY HH24:MI:SS'),
        'BROSENZW', CONVERT(DATETIME, '22-JAN-2007 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));  

当我执行它时,我收到以下错误消息:

消息 8116,第 16 级,状态 1,第 2 行
参数数据类型 varchar 对于转换函数的参数 3 无效

我做错了什么?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你可以使用 CONVERT 风格 113 或者只是放置字符串日期文字:

    CONVERT(data_type [(length)],表达式[,style])

    CREATE TABLE #student(col DATETIME /*,rest_of_columns */);
    
    INSERT INTO #student 
    VALUES (CONVERT(DATETIME, '19-JAN-2007 00:00:00',113) /* ,rest_of_columns */);
    
    INSERT INTO #student              -- style 113 is default so you can skip convert
    VALUES ('19-JAN-2007 00:00:00');
    
    SELECT *
    FROM #student;
    

    LiveDemo

    编辑:

    日期时间接受样式。

    @Brian Stork

    当您转换为日期时间时,您无法添加样式。日期时间不 接受风格。您可以将日期时间转换为具有样式的字符,但是 不是其他方式

    根据官方CONVERT文档(部分备注):

    ╔══════════════════════════╦═════════════════════╦══════════╦══════════════════╗
    ║ Without century (yy) (1) ║ With century (yyyy) ║ Standard ║ Input/Output (3) ║
    ╚══════════════════════════╩═════════════════════╩══════════╩══════════════════╝
    

    3转换为日期时间时输入;转换为字符数据时输出。

    另外考虑如下示例:

    CREATE TABLE #tab(col DATETIME);
    
    INSERT INTO #tab
    VALUES ('12.02.02')
           ,(CONVERT(DATETIME, '12.02.02', 2));
    
    SELECT *
    FROM #tab;
    

    LiveDemo2

    结果:

    ╔═════════════════════╗
    ║         col         ║
    ╠═════════════════════╣
    ║ 2002-12-02 00:00:00 ║
    ║ 2012-02-02 00:00:00 ║
    ╚═════════════════════╝
    

    【讨论】:

    • 转换为日期时间时,无法添加样式。日期时间不接受样式。您可以将日期时间转换为具有样式的字符,但不能以其他方式。
    • @BrianStork 更新了我的答案
    • 我不知道。谢谢你让我看到新的东西!我以后不会犯这个错误了。
    【解决方案2】:

    “我做错了什么?”您正在为 SQL Server 函数使用 Oracle/Postgres 参数(将 to_char()convert() 混淆)。

    最简单的解决方案是使用 ISO 标准格式表示日期时间的字符串:

    INSERT INTO student 
        VALUES (102,'Mr.','Fred','Crocitto','101-09 120th St.','11419','718-555-5555',
                'Albert Hildegard Co.','22-JAN-03','BROSENZWEIG',
                '2007-01-19', 'BROSENZW', '2007-01-22');  
    

    【讨论】:

      【解决方案3】:

      日期时间不接受样式。如果要将其转换为字符串,请使用convert(char(length),'datevale','style'),但如果您的列是 DATETIME 类型,则无需添加样式。

      根本不要使用转换。只需使用字符串'19-JAN-2007 00:00:00'

      【讨论】:

      • Datetime does not accept a style. 这不是真的
      猜你喜欢
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2021-08-31
      • 2019-09-30
      • 1970-01-01
      • 2016-07-29
      • 2022-11-09
      • 1970-01-01
      相关资源
      最近更新 更多