Sql 使用日期值查询varchar字段
在SQLServerDB上,我需要从varchar字段查询dates>getdate 我的表如下所示(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数据类型导致值超
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();