是否有像dated2的isdate()函数?

时间:2012-06-15 02:41:27

标签: sql-server-2008 tsql sql-server-2012 datetime2

我知道有一个名为isdate()的函数来验证日期时间列,但它仅适用于smalldatetime和datetime类型。 问题是:是否有类似的方法来验证sql server 2008和2012中的新数据类型datetime2?

2 个答案:

答案 0 :(得分:12)

在SQL Server 2012中,您可以使用TRY_CONVERT

 SELECT TRY_CONVERT(DATETIME2, '2012-02-02 13:42:55.2323623'),
        TRY_CONVERT(DATETIME2, '2012-02-31 13:42:55.2323623');

结果:

 2012-02-02 13:42:55.2323623    NULL

TRY_PARSE

 SELECT TRY_PARSE('2012-02-02 13:42:55.2323623' AS DATETIME2),
        TRY_PARSE('2012-02-31 13:42:55.2323623' AS DATETIME2);

(结果相同。)

很抱歉,我没有给你一个聪明的回答<我猜你可以说

 SELECT ISDATE(LEFT('2012-02-02 13:42:55.2323623', 23);

但那感觉很脏。

TRY_CONVERT documentation on MSDN
TRY_PARSE documentation on MSDN

答案 1 :(得分:0)

在使用其他日期格式不是LEFT(..., 23)(和SQL-Server 2008)的数据库系统上,请小心使用mdy解决方案。您可以使用DBCC USEROPTIONS命令查看当前会话的日期格式。

在使用德语日期格式(dmy)的数据库系统上,LEFT(..., 23)解决方案不起作用(在日期> 12的日期检测到 )。请参阅以下测试用例:

-- test table using a DATETIME and DATETIME2 column.
CREATE TABLE dt_vs_dt2 (
  dt DATETIME,
  dt2 DATETIME2
);

-- set a datetime values with a day > 12.
DECLARE @date_value AS DATETIME = DATEADD(DAY, 18 - DAY(GETDATE()), GETDATE());

-- insert the current date into both columns using GETDATE.
-- note: using the following on a day > 12
INSERT INTO dt_vs_dt2 VALUES (@date_value, @date_value);

-- let's have a look at the values.
-- the values look the same (the datetime2 is more precise as expected).
SELECT dt, dt2 FROM dt_vs_dt2;

-- now we expect both values are valid date values.
-- to validate the datetime2 value, the LEFT(..., 23) solution is used.
SELECT ISDATE(dt), ISDATE(LEFT(dt2, 23)) 
FROM dt_vs_dt2;

如何解决?

您可以使用CAST(column_name AS DATETIME)代替LEFT(..., 23)来完成这项工作:

-- using a CAST(... AS DATETIME) instead of `LEFT(..., 23)` seems to work.
SELECT dt, CAST(dt2 AS DATETIME) AS dt2
FROM dt_vs_dt2;

-- now both values are valid dates.
SELECT ISDATE(dt) AS dt, ISDATE(CAST(dt2 AS DATETIME)) AS dt2
FROM dt_vs_dt2;

demo on dbfiddle.uk (using dmy) / demo on dbfiddle.uk (using mdy)


在SQL Server 2012及更高版本上,您应使用@Aaron Bertrand answer中所述的TRY_PARSE / TRY_CONVERT解决方案。此答案中说明的CAST(... AS DATETIME)解决方案也应该有效。