SQL查询可提取特定于日期的记录,而无需指定时间戳

时间:2020-05-02 10:22:50

标签: sql sql-server

查询

列出按升序排列的1992年5月1日,1992年12月31日,1992年4月7日加入的员工。

员工表

EmployeeID  LastName    Title                        BirthDate               HireDate
1            Davolio    Sales Representative        1948-12-08 00:00:00.000 1992-05-01 00:00:00.000
2            Fuller     Vice President, Sales       1952-02-19 00:00:00.000 1992-08-14 00:00:00.000
3            Leverling  Sales Representative        1963-08-30 00:00:00.000 1992-04-01 00:00:00.000

查询代码

Select * 
from employees 
where HireDate like '1992-05-01' or 
      HireDate like '1992-12-31' or 
      HireDate like '1992-04-07' 
order by HireDate asc

我得到空结果。基本上这是因为我想没有指定确切的时间戳。如何在不使用时间戳的情况下获得结果。

3 个答案:

答案 0 :(得分:1)

使用单引号和IN子句:

Select * 
from employees 
where HireDate IN ('1992-05-01', '1992-12-31','1992-04-07 ')
order by HireDate asc;

答案 1 :(得分:1)

请勿将like与日期/时间一起使用。期。 SQL Server会将YYYY-MM-DD和YYYYMMDD格式的字符串转换为日期,因此可能会造成混淆,因为值“看起来”像字符串。但他们将其视为日期。

如果您的日期都不包含时间成分,则可以进行简单的比较:

Select * 
from employees 
where HireDate = '1992-05-01' or 
      HireDate = '1992-12-31' or 
      HireDate = '1992-04-07' 
order by HireDate asc;

正如Yogesh指出的那样,您可以使用IN

如果您有非零时间分量-数据表明有可能,那么您可以将值转换为date

where convert(date, HireDate) = '1992-05-01' or 
      convert(date, HireDate) = '1992-12-31' or 
      convert(date, HireDate) = '1992-04-07' 

令人高兴的是,SQL Server仍将使用具有这种类型转换的索引。

而且,您可以将in与此配合使用:

where convert(date, HireDate) in ('1992-05-01', '1992-12-31', '1992-04-07') 

如果您确实要将这些日期视为日期,那么我建议您永久删除时间部分:

alter table employees alter column HireDate date;

答案 2 :(得分:0)

您只需要更改要查询的数据的日期格式即可,只给您一天的时间。

我们可以使用CONVERT()

像这样

CONVERT(VARCHAR(10),hiredate,120)

此外,您需要将LIKE替换为完全匹配的系统。 当您使用多个搜索参数时,我建议使用IN和逗号分隔的列表,以使您的租用日期列表更易于管理,像这样。

WHERE HireDate IN ('1992-05-01','1992-12-31','1992-04-07')

因此,您的结束脚本应该是

SELECT 
* 
FROM employees 
WHERE CONVERT(VARCHAR(10),hiredate,120) IN ('1992-05-01','1992-12-31','1992-04-07')
ORDER BY HireDate ASC

请注意,如果您要按“升序排列”列出,则需要创建一个单独的表格,其中列出了职位名称和某种“级别”系统,或者只是一个详细的编号系统,详细说明了哪个职位-头衔是什么级别的资历。 另外,如果您要处理的职位非常少(例如在示例数据中),则可以使用CASE语句对结果进行排序。 例如

CASE Title WHEN 'President' THEN 1 'Vice President' THEN 2 ELSE 99 END
相关问题