查找两个日期之间的特定月份和年份

时间:2015-01-16 23:25:35

标签: sql-server

我在SQL表Beg_dateEnd_date中有两个日期,包括Employee-ID

需要传递两个参数@Month@Year,以确定@Month@Year是否介于Beg_dateEnd_date之间。< / p>

示例:

传递值@Month = '11'@Year = '2014'

表格数据:Beg_date = '10/1/2013'End_date = '12/31/2014'

由于@Month@Year都来自上述日期,因此应显示Employee-ID

现在,如果将值@Month = '11'@Year = '2012'传递给上述表日期,则不应显示数据。

另一件事是,Employee在同一个表中有多个记录,其中Beg_dateEnd_date不同;脚本应该在给出结果之前搜索所有记录

示例:

Employee-ID     Beg_date       End_date
-----------------------------------------
0001            01/01/2013     11/30/2013
0001            12/01/2013     11/30/2014
0001            12/01/2014     11/30/2015

请告知......

2 个答案:

答案 0 :(得分:0)

更新 - 2:

下面的查询应该适用于MS SQL 2005环境问题中描述的问题。该解决方案主要基于使用CONVERT函数的数据类型转换:

SELECT 
   * 
FROM 
   tab
WHERE 
   CONVERT(DATETIME,
           LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Year)))
           + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Month))), 2)
           + '-01', 120)
   >= CONVERT(DATETIME,
           LTRIM(RTRIM(CONVERT(NVARCHAR(10), YEAR(Beg_date))))
           + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), MONTH(Beg_date)))), 2)
           + '-01', 120)
   AND 
   CONVERT(DATETIME,
           LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Year)))
           + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Month))), 2)
           + '-01', 120)
   <= CONVERT(DATETIME,
           LTRIM(RTRIM(CONVERT(NVARCHAR(10), YEAR(End_date))))
           + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), MONTH(End_date)))), 2)
           + '-01', 120)

它为给定参数DATETIME@Year以及@MonthBeg_date建立有效End_date。从您的示例中获取的WHERE中的示例值将是:

  • @Year@Month 2014-11-01 00:00:00
  • Beg_date 2013-12-01 00:00:00
  • End_date 2014-11-30 00:00:00

将满足条件。

您可以在 SQL Fiddle 上找到一个有效的例子。它是为MSSQL 2008(那里最早的可用版本)完成的,但语法和函数也适用于MSSQL 2005。

我希望它可以帮助你。

  

此答案的先前版本基于我的(错误的)假设   您使用MySQL数据库。

答案 1 :(得分:0)

可以使用DATEFROMPARTS函数轻松完成:

DECLARE @Month INT = 9
DECLARE @Year INT = 2014
DECLARE @ResultDate DATE

DECLARE @t TABLE
    (
      [Employee-ID] CHAR(4) ,
      Beg_date DATETIME ,
      END_date DATETIME
    )


SET @ResultDate = CAST(CAST(@Year AS NVARCHAR(MAX)) + REPLICATE('0', 2 - LEN(CAST(@Month AS NVARCHAR(MAX)))) + CAST(@Month AS NVARCHAR(MAX)) + '01' AS DATE)


INSERT  INTO @t
VALUES  ( '0001', '20130101', '20131130' ),
        ( '0002', '20130112', '20141130' ),
        ( '0003', '20140112', '20151130' )

SELECT  *
FROM    @t
WHERE   @ResultDate BETWEEN Beg_date AND END_date

输出:

Employee-ID Beg_date    END_date
0002        2013-01-12  2014-11-30 
0003        2014-01-12  2015-11-30