我在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)
正常工作,没有任何数据类型转换。
ISDATE(表达)
参数
expression是可以转换为字符串的字符串或表达式。表达式必须少于4,000个字符。日期和时间数据类型(datetime和smalldatetime除外)不允许作为ISDATE的参数。
资料来源:https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql
ISDATE()
只能评估STRING,所以试试这样。
DECLARE @V DATE = '0001-01-01'
SELECT ISDATE(CAST(@V AS VARCHAR(30)))
请注意,Sarthak Grover的answer完全涵盖了出现语法错误的原因。我只是简单地发布了我的答案并添加了一个关于isdate('0001-01-01')
返回false的原因的解释,当它是Date
数据类型的完全有效值时。
ISDATE
函数的整个点是确定参数是否可以在当前的Date
设置下转换为有效的time
,DateTime
或DATEFORMAT
,只需使用cast
(与convert
相同,接受样式参数因此不依赖于在当前日期格式设置。
将DATE
类型的参数传递给ISDATE
函数是没有意义的,因为如果参数的类型是DATE
,则无需检查它。
此外,明确禁止传递日期和时间数据类型的参数,除了datetime
和smalldatetime
,正如Sarthak Grover在他的answer中指出的那样(+1来自我,顺便说一下)。
即使参数可以转换为日期值,如果它在1753-01-01之前或9999-12-31之后表示日期值,ISDATE
函数也将返回false。
这是因为DATETIME
数据类型的值范围是从1753-01-01 00:00:00
到9999-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