SQL日期“0001-01-01”到插入前的日期格式

时间:2014-03-20 19:07:20

标签: sql sql-server

我从代码中的另一个脚本中获取此值,当没有数据时,它来自' 0001-01-01'。我想如果它可以转换这个字符串 0001-01-01'到日期格式" datetime"在我的SQL插入行中,然后将其添加到另一个表。这是我的尝试方式,但没有成功:

my $sql = $dbh->exec_sql(<<SQL, $address, $name, $dateadded);
insert into mytable (address, name, dateadded)
values (?,?, Case When ? = '0001-01-01' then '0001-01-01 00:00:00' Else ?)
SQL

谢谢!

5 个答案:

答案 0 :(得分:2)

这是不可能的,因为这不是sql server中的有效日期。 Sql server考虑1753-01-01和9999-12-31之间的日期。请查看此链接以获取更多信息:"DATETIME"

使用NULL值

答案 1 :(得分:1)

试试这个:

insert into my table (address, name, dateadded) 
values (?, ?, CASE WHEN ISDATE(?)=1 THEN ? ELSE NULL END)

如果需要,您可以将NULL替换为CURRENT_TIMESTAMP等。

答案 2 :(得分:0)

试试这个

insert into my table (address, name, dateadded) values (?, ?, convert(datetime, ?))

答案 3 :(得分:0)

您无法按原样添加该日期,但可以将NULL放在那里。

尝试这个逻辑:

declare @mystr varchar(50)
set @mystr = '0001.01.01'
select
    case
        when isdate(@mystr) = 1
        then @mystr
        else ''
    end

SQL 2012中引入了一个函数try_convert。如果您使用的是该版本,则可以试试。

<强>更新

我正在添加另一个例子:

declare @TheDate datetime
set @TheDate =
    case 
        when isdate('0001.01.01') = 1 
        then '0001.01.01' 
        else cast(null as datetime) 
    end --null will be stored
-- OR Use this instead
set @TheDate = 
    case 
        when isdate('0001.01.01') = 1 
        then '0001.01.01'
        else ''
    end --1900-01-01 00:00:00.000 will be stored
select @TheDate

然后你可以这样做:

insert into mytable 
    (address, name, dateadded)
values 
    (?, ?, 
        case when isdate('0001.01.01') = 1 then '0001.01.01' else '' end
    )

答案 4 :(得分:0)

您不能使用日期时间,因为它必须在17530101 - 99991231范围内,而是使用 datetime2 数据类型代替。

另外,最好将CONVERT用于日期字符串(规范日期格式用char常量识别,这不是强制性的),如下所示:

insert into MyTable (...MyDate ...) values ( ... convert(datetime2, '0001-01-01 00:00:00', 120) ...)

请参阅CONVERT文档here了解格式规范(转换的第三个参数)

相关问题