Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用日期值查询varchar字段_Sql_Sql Server_Datetime_Varchar - Fatal编程技术网

Sql 使用日期值查询varchar字段

Sql 使用日期值查询varchar字段,sql,sql-server,datetime,varchar,Sql,Sql Server,Datetime,Varchar,在SQLServerDB上,我需要从varchar字段查询dates>getdate 我的表如下所示(activatioDate类型为varchar(100)): 我的问题 select * from mytable where activatioDate > GETDATE() 预期结果 22 | 12/3/2021 24 | 12/9/2020 27 | 12/1/2024 我有以下错误 “将varchar数据类型转换为datetime数据类型导致值超

在SQLServerDB上,我需要从varchar字段查询dates>getdate

我的表如下所示(
activatioDate
类型为
varchar(100)
):

我的问题

select * from mytable
where activatioDate > GETDATE()
预期结果

22 | 12/3/2021     
24 | 12/9/2020     
27 | 12/1/2024     
我有以下错误 “将varchar数据类型转换为datetime数据类型导致值超出范围。”


有什么建议吗?

使用
转换

SELECT *
FROM mytable
WHERE CONVERT(datetime, activatioDate, 101) > GETDATE();

但一般来说,您应该避免将日期作为文本存储在SQL数据库中。

您需要修改设计;这才是真正的问题。首先,将值更改为明确的日期/时间格式:

UPDATE dbo.YourTable
SET activatioDate  = CONVERT(varchar(8),CONVERT(date,activatioDate,101),120);
然后您可以
更改该表:

ALTER dbo.YourTable ALTER COLUMN activatioDate  date;
最后,您的查询将起作用:

SELECT *
FROM dbo.YourTable
WHERE activatioDate > GETDATE();

日期不是字符串,而是二进制值。不要将日期存储到字符串字段中。这是一个非常严重的错误。使用正确的类型,
日期
。其他任何东西都能掩盖这个漏洞。这种特殊的字符串格式不允许排序和范围查询
12/3/1800
总是在
11/12/2021
之后出现,请小心将日期值保存为字符串-使用datetimes,因为它们是通用的,而字符串值需要转换,如果要更改数据库中的语言或日期格式,可能会打乱DMY顺序。日期时间不受这些更改的影响,而字符串值受这些设置的影响。因此datetimes更加健壮。除此之外,这类查询将导致大型数据集的查询时间呈指数级增长。在计算表达式之前,需要将整个列转换为Datetime。
SELECT *
FROM dbo.YourTable
WHERE activatioDate > GETDATE();