从表中获取特定日期(年和月)的历史数据

时间:2015-02-03 14:37:14

标签: sql sql-server-2008

考虑以下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   ║

我已经尝试过所有我想到的东西,并且还搜索了一点点但我无法找到对此进行正确查询的方法。

有人可以帮助我吗?

提前致谢,

5 个答案:

答案 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;