declare @id varchar(18)set @id='310501198408097619'
select cast(substring(@id,7,4)+'-'+substring(@id,11,2)+'-'+substring(@id,13,2) as datetime)
--      1984-08-09 

解决方案 »

  1.   

    在计算所得的列规范 公式中输入 select cast(substring(@id,7,4)+'-'+substring(@id,11,2)+'-'+substring(@id,13,2) as datetime)
    提示公式验证错误公式我也有 就是不知道怎么加入
    还是谢谢你
      

  2.   


    declare @id varchar(18)set @id='3105018408097619'
    if Len(@id)=18
    begin
        select substring(@id,7,4)+'-'+substring(@id,11,2)+'-'+substring(@id,13,2) 
    end
    else   --存在旧的身份证号码
    begin
        select '19'+substring(@id,7,2)+'-'+substring(@id,9,2)+'-'+substring(@id,11,2)
    end
      

  3.   


    create function getDate(@id varchar(18))
    returns datetime
    as
    begin
        declare @getdate datetime
        if Len(@id)=18
        begin
            set @getdate= cast((substring(@id,7,4)+'-'+substring(@id,11,2)+'-'+substring(@id,13,2))as datetime)
        end
        else
        begin
            set @getdate= cast(('19'+substring(@id,7,2)+'-'+substring(@id,9,2)+'-'+substring(@id,11,2)) as datetime)
        end
        return @getdate
    endselect dbo.getDate('3105018408097619')
      

  4.   

    use tempdb
    gocreate table t1
    (
    身份证  varchar(18),
    生日 as case LEN(身份证) when 18 
    then substring(身份证,7,4)+'-'+substring(身份证,11,2)+'-'+substring(身份证,13,2)
    else '19'+substring(身份证,7,2)+'-'+substring(身份证,9,2)+'-'+substring(身份证,11,2)
    end
    )
    goinsert t1 select '310501198408097619'
    goselect * from t1
    go
    /**
    身份证                生日
    ----------------------------------
    310501198408097619 1984-08-09
    **/drop table t1
    go
      

  5.   


    UPDATE table SET 出生年月=dbo.getDate(身份证号码) 
      

  6.   

    declare @id varchar(18)set @id='3105018408097619'
    if Len(@id)=18
    begin
        select substring(@id,7,4)+'-'+substring(@id,11,2)+'-'+substring(@id,13,2) 
    end
    else   --存在旧的身份证号码
    begin
        select '19'+substring(@id,7,2)+'-'+substring(@id,9,2)+'-'+substring(@id,11,2)
    end
      

  7.   

    declare @id varchar(18)set @id='310501198408097619'
    if Len(@id)=18
    begin
        select cast(substring(@id,7,8) as datetime ) as birthdate
    end
    else   
    begin
        select cast('19'+substring(@id,7,6) as datetime)as birthdate
    end
      

  8.   

    你是用公式吗,就是定义一个列,该列的值是由身份证字段计算出来的,如果是这样的话,写上如下内容即可:
    cast(substring(身份证,7,4)+'-'+substring(身份证,11,2)+'-'+substring(身份证,13,2) as datetime)

    substring(身份证,7,4)+'-'+substring(身份证,11,2)+'-'+substring(身份证,13,2)
      

  9.   

    建議你建一個函數方便以後調用,我正好做過一個,如下:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GOCREATE FUNCTION [dbo].[Birthday] 
    (
    @IDCardNo NVARCHAR(50)
    )
    RETURNS SMALLDATETIME
    AS
    BEGIN
    DECLARE @Birthday SMALLDATETIME
    SET @Birthday= (CASE WHEN LEN(@IDCardNo)=15 THEN CONVERT(VARCHAR(10),SUBSTRING(@IDCardNo,7,2)+'-'+SUBSTRING(@IDCardNo,9,2)+'-'+SUBSTRING(@IDCardNo,11,2),120)
     WHEN LEN(@IDCardNo)=18 THEN CONVERT(VARCHAR(10),SUBSTRING(@IDCardNo,7,4)+'-'+SUBSTRING(@IDCardNo,11,2)+'-'+SUBSTRING(@IDCardNo,13,2),120)
    END)
    RETURN(@Birthday)
    END調用測試:
    --15位身份證
    SELECT [dbo].[Birthday]('512223700101104')
    -----------------------
    --1970-01-01 00:00:00--18位身份證
    SELECT [dbo].[Birthday]('310501198408097619 ')
    -----------------------
    --1984-08-09 00:00:00
      

  10.   

    不好意思啊~验证了一下 发现一加入case语句就报错~~ 你提供的公式只能判断18位的~~15位的或者其他的怎么处理?