ISDATE为DATE(数据类型)值生成错误

问题描述 投票:0回答:3

我在My_Table中有一个MyDate(数据类型为DATE)列

MyDate
2016-11-01
0001-01-01
2016-08-01

当我执行以下查询

SELECT  ISDATE(MyDate),* FROM My_Table

我收到以下错误

消息8116,级别16,状态1,行2参数数据类型日期对于isdate函数的参数1无效。

我认为问题可能是日期'0001-01-01'。但是当我执行时

SELECT ISDATE('0001-01-01')

它按预期工作并产生结果0。(即不是约会)

DECLARE @V AS DATE = '0001-01-01' --no error
SELECT ISDATE(@V) --error

这产生了同样的错误。我错在哪里?

编辑: - 如果我从Mytable中删除值'0001-01-01',查询SELECT ISDATE(MyDate)正常工作,没有任何数据类型转换。

sql-server tsql
3个回答
3
投票

ISDATE(表达)

参数

expression是可以转换为字符串的字符串或表达式。表达式必须少于4,000个字符。日期和时间数据类型(datetime和smalldatetime除外)不允许作为ISDATE的参数。

资料来源:https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql


2
投票

ISDATE()只能评估STRING,所以试试这样。

DECLARE @V DATE = '0001-01-01'
SELECT ISDATE(CAST(@V AS VARCHAR(30))) 

2
投票

请注意,Sarthak Grover的answer完全涵盖了出现语法错误的原因。我只是简单地发布了我的答案并添加了一个关于isdate('0001-01-01')返回false的原因的解释,当它是Date数据类型的完全有效值时。

ISDATE函数的整个点是确定参数是否可以在当前的Date设置下转换为有效的timeDateTimeDATEFORMAT,只需使用cast(与convert相同,接受样式参数因此不依赖于在当前日期格式设置。 将DATE类型的参数传递给ISDATE函数是没有意义的,因为如果参数的类型是DATE,则无需检查它。

此外,明确禁止传递日期和时间数据类型的参数,除了datetimesmalldatetime,正如Sarthak Grover在他的answer中指出的那样(+1来自我,顺便说一下)。

即使参数可以转换为日期值,如果它在1753-01-01之前或9999-12-31之后表示日期值,ISDATE函数也将返回false。 这是因为DATETIME数据类型的值范围是从1753-01-01 00:00:009999-12-31 23:59:59.997

这是一个简单的演示(try it yourself on rextester):

DECLARE @T AS TABLE
(
    DateString varchar(20),
    Comments varchar(100)
);

INSERT INTO @T (DateString, Comments) VALUES
('1752-12-31', 'will always return false'),
('1753-01-01', 'will always return true'),
('2018-02-27', 'depends on dateformat'),
('2018-27-02', 'depends on dateformat');

SET DATEFORMAT YMD;

SELECT  DateString, 
        Comments, 
        ISDATE(DateString) As IsDate
FROM @T;

SET DATEFORMAT YDM;

SELECT  DateString, 
        Comments, 
        ISDATE(DateString) As IsDate
FROM @T;

结果:

DateString      Comments                    IsDate
1752-12-31      will always return false    0
1753-01-01      will always return true     1
2018-02-27      depends on dateformat       1
2018-27-02      depends on dateformat       0

DateString      Comments                    IsDate
1752-12-31      will always return false    0
1753-01-01      will always return true     1
2018-02-27      depends on dateformat       0
2018-27-02      depends on dateformat       1
© www.soinside.com 2019 - 2024. All rights reserved.