1

我在 Sql Server 2005 中将 varchar 转换为 datetime。如果提供的 varchar 具有意外格式,我可以强制 Sql Server 失败吗?

例子:

select convert(datetime, '01-2010-02', 103) 

预期结果:查询失败,因为 103 表示 dd/mm/yyyy(请参阅msdn)。

实际结果:2010-02-01 00:00:00.000

请求执行的主要目的是按日和月的顺序。如果 varchar 以 yyyy-mm-dd 格式提供,则 Sql Server 会将 mm 视为日,将 dd 视为月,因为提供格式 (dd/mm/yyyy) 的日/月顺序。

注意:我可以编写自定义函数来手动处理这种情况。但我希望这样的企业数据库已经可以严格处理数据。

4

3 回答 3

0

您可以将日期与转换为日期时间的数据进行比较,然后再返回。我不确定这样做是否有任何陷阱,但我有限的测试没有发现任何陷阱。

if @StrDate = convert(varchar(10), convert(datetime, @StrDate, 103) ,103)
于 2011-02-24T18:57:41.793 回答
0

每当 SQL Server 看到明确的 Year 候选者时,它将始终用作 Year。

其余 DM 部分由 DMY 设置或转换格式中的顺序确定。如果那不是真的,那么非常简单的转换就会崩溃。

例子

set dateformat dmy
select 1 a,CONVERT(datetime, '1-2-3') b
union all
select 2,CONVERT(datetime, '2001-2-3')
union all
select 3,CONVERT(datetime, '2001-3-2')

输出

a           b
----------- -----------------------
1           2003-02-01 00:00:00.000
2           2001-03-02 00:00:00.000
3           2001-02-03 00:00:00.000

第 2 和第 3 明确将年份放在前面,没关系


编辑

在线图书有这个说法http://msdn.microsoft.com/en-us/library/ms180878.aspx#StringLiteralDateandTimeFormats

SET DATEFORMAT 有很多例外,无论转换的第三个参数如何,它都会起作用。

  • SET DATEFORMAT 会话设置不适用于全数字日期条目
  • 此 [ISO 8601] 格式不受登录默认语言设置的 SET DATEFORMAT、SET LANGUAGE 的影响。
  • 当您以字母形式指定月份时,不会应用 SET DATEFORMAT 会话设置。
  • ETC

要专门验证 dd/mm/yyyy,请改用以下内容

set dateformat dmy
declare @input varchar(10) set @input = '12-2010-01'

-- convert allows the date through
select convert(datetime, @input, 103) -- 2010-01-12 00:00:00.000

-- the case below returns 0 { = invalid date }
-- this uses 8-digit format which is always interpreted YYYYMMDD regardless
-- of language or dateformat settings
select case
    when @input not like '__/__/____' then 0
    else isdate(right(@input,4)+right(left(@input,5),2)+left(@input,2))
    end
于 2011-02-24T18:29:47.800 回答
0

恐怕您必须使用CLR 函数并利用DateTime.TryParseExact方法。不是一个优雅的解决方案,但可以工作。

于 2011-02-24T18:27:22.357 回答