Sql 如何编写查询以获取时段范围内的数据?

Sql 如何编写查询以获取时段范围内的数据?,sql,oracle,Sql,Oracle,我有一个包含如下列的employee表 emp_id, firstname, lastname, month and year. 现在我需要从表中获取2012年1月至2012年3月期间的员工 在“月”和“年”列中,我们分别存储1月和3月的“1”,即“月数”和“年”列具有类似2012年的年份。 请提供帮助。2012年1月至3月期间的员工: select * from employee where year = 2012 and month between 1 and 3 2012年1月至20

我有一个包含如下列的employee表

emp_id, firstname, lastname, month  and year.
现在我需要从表中获取2012年1月至2012年3月期间的员工 在“月”和“年”列中,我们分别存储1月和3月的“1”,即“月数”和“年”列具有类似2012年的年份。

请提供帮助。

2012年1月至3月期间的员工:

select * from employee
where year = 2012 and month between 1 and 3
2012年1月至2013年3月期间的员工:

select * from employee
where (year = 2012 and month between 3 and 12)
or (year = 2013 and month between 1 and 3)

我认为你最好在做选择之前把一切都转换成datetime。我个人更喜欢一个单独的datetime列,而不是单独的“月”和“年”列,但是如果你不能这样做,类似这样的东西会起作用:

SELECT * FROM employees 
 WHERE CAST( CAST(year AS VARCHAR(4)) +
            RIGHT('0' + CAST(month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)
BETWEEN
    CAST( CAST(start_year AS VARCHAR(4)) +
            RIGHT('0' + CAST(start_month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)
AND
    CAST( CAST(end_year AS VARCHAR(4)) +
            RIGHT('0' + CAST(end_month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)

不幸的是,这有点难看。也许可以在selection语句之前将开始日期和结束日期转换为datetime并将其存储在变量中来清理它?

您好,这可能会对您有所帮助

 select * from emp
where to_date(concat('1-',concat(concat(month,'-'), year)),'DD-MM-YY') 
      between to_date('1-&month-&year' ,'DD-MM-YY') 
and   to_date('1-&month-&year' ,'DD-MM-YY') ;

我将每月和每年的值转换为指定格式的数据并进行比较。

谢谢您的回答。但是如果我需要在2012年3月到2013年3月之间获取数据呢?我将在where子句中输入四个输入,如start_MOUNT、start_year、end_MOUNT和end_year。这将取决于用户选择。@Ahish选择*来自员工,其中(起始年和结束年之间的年份,起始月和结束月之间的月份)或(年份>起始年和结束月)year@JonasT这在2011年10月到2013年3月的范围内不起作用。@yhw42(year>start\u year和year此查询给我“缺少表达式”where子句中出现错误。抱歉,我不知道您正在使用Oracle。我的查询在SQL中运行良好,您可以采用这个概念,即将年和月组合为YYYYMM格式的字符串,然后与您的值进行比较提示:Oracle有一个日期数据类型,您应该将月和年列存储在该数据类型的一列中只需将day设置为1,将hour、minute和seconds设置为0。您的查询将更容易,您可以更好地为新列编制索引。
 select * from emp
where to_date(concat('1-',concat(concat(month,'-'), year)),'DD-MM-YY') 
      between to_date('1-&month-&year' ,'DD-MM-YY') 
and   to_date('1-&month-&year' ,'DD-MM-YY') ;