两个日期之间的SQL未返回正确的结果
我正在使用下面的查询,我想得到“[上次更新日期]”在2015年或2016年的行两个日期之间的SQL未返回正确的结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用下面的查询,我想得到“[上次更新日期]”在2015年或2016年的行 SELECT [NPI] ,[Entity Type Code] ,[Replacement NPI] ,[Employer Identification Number (EIN)] ,[Provider Organization Name (Legal Business Name)] ,[Provider Last Name (Legal Name)]
SELECT [NPI]
,[Entity Type Code]
,[Replacement NPI]
,[Employer Identification Number (EIN)]
,[Provider Organization Name (Legal Business Name)]
,[Provider Last Name (Legal Name)]
,[Provider First Name]
,[Provider Middle Name]
,[Provider Name Prefix Text]
,[Provider Name Suffix Text]
,[Provider Credential Text]
,[Provider Enumeration Date]
,[Last Update Date]
,[Healthcare Provider Taxonomy Code_1]
FROM [Database].[dbo].[NPIInfo]
WHERE[Healthcare Provider Taxonomy Code_1] in ('122300000X', '1223G0001X','1223P0221X','1223P0700X')
AND ([Last Update Date] BETWEEN '2015/01/01' AND '2016/12/31' )
order by [Last Update Date]
当我运行上面的代码时,我没有收到任何结果。但如果我用这个“AND”语句运行它,我会得到结果:
AND [Last Update Date] like '%2015%' or [Last Update Date] like '%2016%'
这个结果给了我500000多行
如果我每年都以这种方式运行,结果会少得多:
AND [Last Update Date] like '%2015%'
知道我做错了什么吗?最后两个和语句给出了不同的结果
WHERE CONVERT(DATETIME, [Last Update Date] , 103) BETWEEN '2015/01/01' AND '2016/12/31'
检查此页面以了解不同的格式
试试看
WHERE CONVERT(DATETIME, [Last Update Date] , 103) BETWEEN '2015/01/01' AND '2016/12/31'
检查此页面以了解不同的格式
编辑:显然我错了。留下答案供参考,以确定什么不是问题。但是,
CAST
代码可能仍然有效
首先,不能对文本数据使用BETWEEN
,必须使用日期时间或数字格式。如果[上次更新日期]
是文本,则需要将其转换为日期时间,然后才能对其执行任何操作。最好更改实际数据的格式,但如果由于某种原因无法更改,这可能会起作用:
AND (CAST([Last Update Date] as datetime)
BETWEEN CAST('2015/01/01' as datetime) AND CAST('2016/12/31' as datetime))
关于您的
语句,如“%2015%”
语句,您使用的通配符条件专门用于文本数据;这就是为什么它能起作用。不同的行数是因为第一个像一样的行数同时查找2015年和2016年,而第二个只查找2015年。编辑:显然我在这里错了。留下答案供参考,以确定什么不是问题。但是,CAST
代码可能仍然有效
首先,不能对文本数据使用BETWEEN
,必须使用日期时间或数字格式。如果[上次更新日期]
是文本,则需要将其转换为日期时间,然后才能对其执行任何操作。最好更改实际数据的格式,但如果由于某种原因无法更改,这可能会起作用:
AND (CAST([Last Update Date] as datetime)
BETWEEN CAST('2015/01/01' as datetime) AND CAST('2016/12/31' as datetime))
关于您的
语句,如“%2015%”
语句,您使用的通配符条件专门用于文本数据;这就是为什么它能起作用。不同的行数是因为第一个类似的同时查找2015年和2016年,而第二个只查找2015年。上次更新日期是什么类型的?看起来像是一个字符串,可能是一种不同的格式,添加了基于所用非标准标识符的sql server
语法。如果您使用的是不同的DBMS,请重新标记它是一个varchar(200)。请尝试从[NPIInfo]
中选择前100名[上次更新日期],查看日期格式,如图所示:2015年2月1日varchar 200上次更新日期是什么类型?看起来像是一个字符串,可能是一种不同的格式,添加了基于所用非标准标识符的sql server
语法。如果您使用的是不同的DBMS,请重新标记它是一个varchar(200)尝试从[NPIInfo]
中选择前100名[上次更新日期]查看日期格式看起来2015年2月1日varchar 200不是到\u日期
Oracle语法?Oracle或mysql,或postgresql,但肯定不是TSQL。我运行了该命令,但出现了以下错误:从字符串转换日期和/或时间时,转换失败。@user1342164检查链接,看看哪种格式更适合您的情况我认为101或103应该是适合您的格式不是to_date
Oracle语法?Oracle或mysql,或postgresql,但肯定不是TSQL。我运行了该命令,但出现了以下错误:从字符串转换日期和/或时间时,转换失败。@user1342164检查链接,看看哪种格式更适合您的情况我认为101或103应该适合您您您可以对文本数据使用between
,但日期必须采用格式YYYY/MM/DD
您完全可以在文本数据中使用BETWEEN。不要使用文本存储日期。不要在日期范围内使用between。我们之间只是一个懒惰的语法快捷方式,如果使用时没有很好的理解它可能会导致错误的选择和计算。改为使用>=和<。@由\u使用\u您已经可以解释如何在两条线索之间导致错误了吗?关于这一点有很多参考文献,请尝试从这些参考文献开始,您可以使用BETWEEN
来存储文本数据,但日期必须采用YYYY/MM/DD
格式,您绝对可以使用BETWEEN来存储文本数据。不要使用文本来存储日期。不要在日期范围内使用between。我们之间只是一个懒惰的语法快捷方式,如果使用时没有很好的理解它可能会导致错误的选择和计算。请改用>=和<。@Used\u By\u已经可以解释为什么会导致错误了吗?关于这方面的参考文献很多,请尝试从这些开始,然后