考虑以下employee_history表:
╔═════════╦═══════╦═════════════╦═══════════════╦══════╗
║ ID ║ idEMP ║ startDate ║ endDate ║ Money║
╠═════════╬═══════╬═════════════╬═══════════════╬══════╣
║ 1 ║ 1 ║ 2013-11-01 ║ 2013-11-25 ║ 100 ║
║ 2 ║ 1 ║ 2013-11-25 ║ 2014-01-01 ║ 50 ║
║ 3 ║ 1 ║ 2014-01-01 ║ 2014-01-10 ║ 25 ║
║ 4 ║ 1 ║ 2014-01-10 ║ 2014-01-15 ║ 50 ║
║ 5 ║ 1 ║ 2014-01-15 ║ 2014-01-20 ║ 18 ║
║ 6 ║ 1 ║ 2014-01-20 ║ 2014-02-01 ║ 70 ║
║ 7 ║ 1 ║ 2014-02-01 ║ NULL ║ 10 ║
╚══════════════════════════════════════════════════════╝
基本上,这意味着从startDate到endDate,员工的金额为' Money'。
我需要做的是在历史记录表中找到一名员工特定年和月的所有记录。但是没有获得以结尾的记录下个月的第一天。
例如:如果我要搜索' 2013-12-01'这应该是输出:
╔═════════╦═══════╦═════════════╦═══════════════╦══════╗
║ ID ║ idEMP ║ startDate ║ endDate ║ Money║
╠═════════╬═══════╬═════════════╬═══════════════╬══════╣
║ 2 ║ 1 ║ 2013-11-25 ║ 2014-01-01 ║ 50 ║
如果我要搜索2013-11-01'输出将是:
╔═════════╦═══════╦═════════════╦═══════════════╦══════╗
║ ID ║ idEMP ║ startDate ║ endDate ║ Money║
╠═════════╬═══════╬═════════════╬═══════════════╬══════╣
║ 1 ║ 1 ║ 2013-11-01 ║ 2013-11-25 ║ 100 ║
║ 2 ║ 1 ║ 2013-11-25 ║ 2014-01-01 ║ 50 ║
如果我正在搜索' 2014-01-1'输出将是:
╔═════════╦═══════╦═════════════╦═══════════════╦══════╗
║ ID ║ idEMP ║ startDate ║ endDate ║ Money║
╠═════════╬═══════╬═════════════╬═══════════════╬══════╣
║ 3 ║ 1 ║ 2014-01-01 ║ 2014-01-10 ║ 25 ║
║ 4 ║ 1 ║ 2014-01-10 ║ 2014-01-15 ║ 50 ║
║ 5 ║ 1 ║ 2014-01-15 ║ 2014-01-20 ║ 18 ║
║ 6 ║ 1 ║ 2014-01-20 ║ 2014-02-01 ║ 70 ║
如果我正在搜索' 2014-05-01'输出将是:
╔═════════╦═══════╦═════════════╦═══════════════╦══════╗
║ ID ║ idEMP ║ startDate ║ endDate ║ Money║
╠═════════╬═══════╬═════════════╬═══════════════╬══════╣
║ 7 ║ 1 ║ 2014-02-01 ║ NULL ║ 10 ║
我已经尝试过所有我想到的东西,并且还搜索了一点点但我无法找到对此进行正确查询的方法。
有人可以帮助我吗?
提前致谢,
答案 0 :(得分:0)
SELECT money, startdate, substring_index(startdate,'-','-1') as date
FROM table
WHERE date = '2014-01'
以下代码按月对其进行排序 试试这个,我有点破译你的意思。 我认为这是你想要的:)
答案 1 :(得分:0)
尝试类似的事情:
select ID,
idEMP,
rtrim(startDate || ' ' || endDate) as empl_time,
Money
from employee_history
where empl_time like '%<your values>%'
答案 2 :(得分:0)
假设您输入的搜索日期必须是varchar为yyyy-mm,那么以下内容应该有效:
Select *
from tbl
where @date between Cast(startDate as varchar(7)) and Cast(DateAdd(Month, -1, ISNULL(endDate, '9999-12-31')) as varchar(7))
@date - 成为你'yyyy-mm'varchar
答案 3 :(得分:0)
试试这个:
select *
from Table1
where Cast(startDate as varchar(7)) <= Cast('YOUR_DATE'as varchar(7))
and (Cast(startDate as varchar(7)) > Cast('YOUR_DATE'as varchar(7))
or Cast(startDate as varchar(7)) is null);
您还可以在SQLFiddle中查看此演示。
编辑:删除=
答案 4 :(得分:0)
这样应该可行:
SELECT *
FROM employee_history
WHERE startDate <= DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@searchDate)+1,0)) AND
(endDate > CAST(CAST(YEAR(@searchDate) AS varchar) + '-' + CAST(MONTH(@searchDate) AS varchar) + '-01' AS DATETIME)
OR endDate is null)
以下表述:
DECLARE @searchDate DATE = '2013-11-01'
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@searchDate)+1,0))
产生此输出:
2013-11-30 23:59:59.000
即。 &#39;搜索日期&#39;的最后一天。
然而,这个表达式:
DECLARE @searchDate DATE = '2013-11-01'
SELECT CAST(CAST(YEAR(@searchDate) AS varchar) + '-' + CAST(MONTH(@searchDate) AS varchar) + '-01' AS DATETIME)
生成<搜索日期&#39;月份的第一天。
如上所述,我建议的查询获取所有记录的间隔,即startDate
- endDate
,重叠与对应于&#39;搜索日期&的月份#39;