使用convert时比较SQL Server中的日期
我试图编写一个查询,当某个列(值)早于1/1/1996时返回所有记录。该列的数据类型是使用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) 我得到了很多结果,包括日期
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是的,在理想的世界中,这将是完美的,但是,对于这个系统非常旧并且需要维护的客户来说,这是不可能的。也许你能帮我回答我的问题?很多人都有短期的答案。长期的,这被称为“技术债务”,这是一个我试图解释的术语