使用convert时比较SQL Server中的日期

使用convert时比较SQL Server中的日期,sql,sql-server,Sql,Sql Server,我试图编写一个查询,当某个列(值)早于1/1/1996时返回所有记录。该列的数据类型是varchar,因此我首先将其转换为datetime格式 以下是查询: select * from T1 where convert(varchar(20), convert(datetime, value), 113) > convert(varchar(20), convert(datetime, '1/1/1996'), 113) 我得到了很多结果,包括日期

我试图编写一个查询,当某个列(值)早于1/1/1996时返回所有记录。该列的数据类型是
varchar
,因此我首先将其转换为
datetime
格式

以下是查询:

select *
from T1
where convert(varchar(20), convert(datetime, value), 113) > convert(varchar(20),   convert(datetime, '1/1/1996'), 113) 
我得到了很多结果,包括日期<1996年1月1日的记录

我做错了什么?

只需比较日期:

 where convert(datetime, value, 113) < '1996-01-01'
其中转换(日期时间,值,113)<'1996-01-01'
仅在出于某种原因需要时转换

对于常数,使用ISO标准格式,如YYYY-MM-DD。

只需比较日期:

 where convert(datetime, value, 113) < '1996-01-01'
其中转换(日期时间,值,113)<'1996-01-01'
仅在出于某种原因需要时转换

对于常数,请使用ISO标准格式,如YYYY-MM-DD。

试试这个

select *
from T1
where convert(datetime, value, 113) < convert(datetime, '1/1/1996', 113)
选择*
从T1开始
其中convert(datetime,value,113)
试试这个

select *
from T1
where convert(datetime, value, 113) < convert(datetime, '1/1/1996', 113)
选择*
从T1开始
其中convert(datetime,value,113)
SQL Server进行内部数据转换,因此如果您的列是DATE,那么这将非常容易

但是,由于它存储为字符串(这是一个非常糟糕的主意),因此在使用它之前必须先将其转换为日期

首先,测试您的列,确保您可以实际转换所有内容

Select Distinct Convert (DateTime, Value, 113) ConvertedDate From T1
如果这样做没有问题,请使用
convert
将字符串列转换为日期,然后比较:

Select *
From T1
Where Convert (DateTime, Value, 113) > '1/1/1996'
如果你有一些奇怪的值,那么使用
ISDATE
来过滤掉好的数据

Select *
From T1
Where ISDATE (Value) = 1
   And Convert (DateTime, Value, 113) > '1/1/1996'

SQL Server进行内部数据转换,所以如果列是DATE,那么这将非常容易

但是,由于它存储为字符串(这是一个非常糟糕的主意),因此在使用它之前必须先将其转换为日期

首先,测试您的列,确保您可以实际转换所有内容

Select Distinct Convert (DateTime, Value, 113) ConvertedDate From T1
如果这样做没有问题,请使用
convert
将字符串列转换为日期,然后比较:

Select *
From T1
Where Convert (DateTime, Value, 113) > '1/1/1996'
如果你有一些奇怪的值,那么使用
ISDATE
来过滤掉好的数据

Select *
From T1
Where ISDATE (Value) = 1
   And Convert (DateTime, Value, 113) > '1/1/1996'

在SQL Server中有许多转换或强制转换日期时间的方法。其他人对转换(datetime,value,113)做了很好的介绍,但我注意到你的评论,
'10/9/2001 11:00:00 PM'
转换失败,这可能是因为格式
113
欧洲默认+mmillieseconds
don mon yyyyyy hh:mi:ss:mmm(24小时)

因此,您必须使用另一种格式才能工作,但如果您阅读Microsoft文档中的可用格式列表

因此,
'10/9/2001 11:00:00 PM'
要么是
MM/dd/yyyyy hh:MM:ss tt
要么是
dd/MM/yyyyy hh:MM:ss tt
,这两种格式都不在列表中

这意味着您必须切碎并重新排列字符串,或者简单地使用另一种转换方法

如果
MM/dd/yyyy hh:MM:ss tt
格式,只需使用
CAST('10/9/2001 11:00:00 PM'作为日期时间)

如果
dd/MM/yyyy hh:MM:ss tt
格式有点复杂,但您可以使用
尝试解析('10/9/2001 11:00:00 PM'作为日期时间,使用'en GB')
如果您有SQL Server 2012+


正是因为这个原因,才不应该将日期时间存储为字符串。

在SQL Server中有许多转换或强制转换日期时间的方法。其他人对转换(datetime,value,113)做了很好的介绍,但我注意到你的评论,
'10/9/2001 11:00:00 PM'
转换失败,这可能是因为格式
113
欧洲默认+mmillieseconds
don mon yyyyyy hh:mi:ss:mmm(24小时)

因此,您必须使用另一种格式才能工作,但如果您阅读Microsoft文档中的可用格式列表

因此,
'10/9/2001 11:00:00 PM'
要么是
MM/dd/yyyyy hh:MM:ss tt
要么是
dd/MM/yyyyy hh:MM:ss tt
,这两种格式都不在列表中

这意味着您必须切碎并重新排列字符串,或者简单地使用另一种转换方法

如果
MM/dd/yyyy hh:MM:ss tt
格式,只需使用
CAST('10/9/2001 11:00:00 PM'作为日期时间)

如果
dd/MM/yyyy hh:MM:ss tt
格式有点复杂,但您可以使用
尝试解析('10/9/2001 11:00:00 PM'作为日期时间,使用'en GB')
如果您有SQL Server 2012+


正是因为这个原因,DATETIMEs永远不应该被存储为字符串。

“我做错了什么?”-你可以比较字符串而不是日期。从根本上说,你做错了的是将日期存储为字符串。你需要尽快将数据类型更改为日期数据类型。我就把它留在这里。…。@Nick.McDermaid Yes,在一个理想的世界中,这将是完美的,但是对于这个拥有非常旧的系统并且需要维护的客户来说,这是不可能的。也许你能帮我回答我的问题?很多人都有短期的答案。从长远来看,这被称为“技术债务”,我试图用这个术语来帮助客户理解这种情况。我完全理解这种情况,但我不清楚您是从头开始构建这个系统,还是在使用遗留系统。“我做错了什么?”-您可以比较字符串而不是日期。从根本上说,您所做的错误是将日期存储为字符串。您需要尽快将数据类型更改为日期数据类型。我将此信息留在这里。…。@Nick.McDermaid是的,在理想的世界中,这将是完美的,但是,对于这个系统非常旧并且需要维护的客户来说,这是不可能的。也许你能帮我回答我的问题?很多人都有短期的答案。长期的,这被称为“技术债务”,这是一个我试图解释的术语