【问题标题】:SQL Server Msg 241, Level 16, State 1, Conversion failed when converting date and/or time from character stringSQL Server 消息 241,级别 16,状态 1,从字符串转换日期和/或时间时转换失败
【发布时间】:2016-08-21 02:49:17
【问题描述】:

执行我创建的stored procedure 时出现此错误

消息 241,级别 16,状态 1,过程 UDP_INITIAL_CUSTOMER_DIM_POPULATION,第 28 行
从字符串转换日期和/或时间时转换失败。

程序的代码是:

CREATE PROCEDURE UDP_INITIAL_CUSTOMER_DIM_POPULATION
AS
BEGIN
    SET NOCOUNT ON

    EXEC UDP_REMOVE_NULLS_FROM_CUSTOMER_STG

    INSERT INTO dbo.customer_dim(customer_no, first_name, middle_name, last_name,
                                 street_number, street_name, po_address, zip_code, city,
                                 region, country)
        SELECT DISTINCT 
            CAST(customer_no AS VARCHAR),
            first_name,
            middle_name,
            last_name,
            street_number,
            street_name,
            po_address,
            zip_code,
            city,
            region,
            country
        FROM 
            dbo.customer_stg

    PRINT 'Initial customer data in place!'
    SET NOCOUNT OFF
END

创建customer_dim 表的代码是:

CREATE PROCEDURE dbo.UDP_CREATE_CUSTOMER_DIM
AS
BEGIN
    IF OBJECT_ID('customer_dim', 'U') IS NOT NULL
    BEGIN
        DROP TABLE customer_dim
    END

    CREATE TABLE [dbo].[customer_dim]
    (
        [customer_sk] INT IDENTITY (1,1) PRIMARY KEY,
        [customer_no] [varchar](50) NULL,
        [first_name] [varchar](50) NULL,
        [middle_name] [varchar](50) NULL,
        [last_name] [varchar](50) NULL,
        [customer_name] [varchar](50) NULL,
        [street_number] [varchar](50) NULL,
        [street_name] [varchar](50) NULL,
        [customer_address] [varchar](100) NULL,
        [po_address] [varchar](50) NULL,
        [zip_code] [varchar](50) NULL,
        [city] [varchar](50) NULL,
        [region] [varchar](50) NULL,
        [country] [varchar](50) NULL,
        [effective_date] DATE NULL DEFAULT GETDATE(),
        [expiry_date] DATE NULL DEFAULT '999-12-31'
    ) ON [PRIMARY]
    END

我已尝试寻找解决方案,但因为我没有尝试在日期或时间做任何事情,所以我找不到任何对我有意义的事情。

【问题讨论】:

  • 我认为这是expiry_date的默认值。

标签: sql sql-server type-conversion


【解决方案1】:

我在 SQL 2017 中进行字符串到日期的转换,它可以正确处理 m/d/yyyy 格式的字符串,其中包含一位数和两位数的日期或月份以及两位或四位数的年份。例如,以下字符串转换干净:

2/6/2012
1/20/2020
12/21/2017
6/14/21

在我的例子中,我发现问题出在一条值为“5/15/161”的记录上。要查找错误数据,请使用 ISDATE() 函数。就我而言:

SELECT [EMPLOYER NUMBER],[PLAN],[EMPLOYER NAME],[LAST UPDATED]
FROM [CONTACT NAME ADDRESS]
where [last updated] is not null
  and isdate([last updated]) <> 1

【讨论】:

    【解决方案2】:

    查询执行器将默认值转换为列的数据类型。

    日期数据类型需要“YYYY-mm-dd” fromat中的数据

    Luke 问题在于您的日期数据类型的默认值。

    当 sql 尝试转换 /cast yyy-mm-dd 时,它无法将其转换为日期

    【讨论】:

      【解决方案3】:

      错误是由expiry_date 的默认值引起的。跑步

      SELECT CAST('999-12-31'AS DATE)
      

      会产生错误:

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

      你想要的是

      [expiry_date] DATE NULL DEFAULT '9999-12-31'
      

      【讨论】:

        猜你喜欢
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多