我从代码中的另一个脚本中获取此值,当没有数据时,它来自' 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
谢谢!
答案 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了解格式规范(转换的第三个参数)