查询
列出按升序排列的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
我得到空结果。基本上这是因为我想没有指定确切的时间戳。如何在不使用时间戳的情况下获得结果。
答案 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