从两个日期和时间之间的日期范围中选择数据

时间:2017-12-14 11:43:17

标签: sql date sql-server-2012 syntax-error

我有与此处记录的完全相同的问题 Select data from date range between two dates

但是当我使用解决方案时,它对我不起作用。唯一的区别是我的表在一列中有日期和时间。所以我希望能够返回属于日期范围的所有值

到目前为止我有这个但是没有工作

SELECT * FROM aview 
WHERE startDate BETWEEN ('2017-11-25 11:27:00.000', '2018-11-25 11:27:00.000') OR 
leftdate BETWEEN ('2017-11-25 11:27:00.000', '2018-11-25 11:27:00.000') OR 
start_Date <= '2017-11-25 11:27:00.000' AND left_dept_date >= '2018-11-25 11:27:00.000'

4 个答案:

答案 0 :(得分:1)

我从来没有在{s}查询中看到BETWEEN(from,to)作为模式 - 当它不起作用时,你会让它看起来像一个类似于SUBSTRING(column, index)的函数调用像那样。试试这个:

SELECT * FROM aview 
WHERE 
  startDate BETWEEN CONVERT(datetime, '2017-11-25 11:27:00.000', 121) AND CONVERT(datetime, '2018-11-25 11:27:00.000', 121) OR 
  leftdate BETWEEN CONVERT(datetime, '2017-11-25 11:27:00.000', 121) AND CONVERT(datetime, '2018-11-25 11:27:00.000', 121) OR 
  start_Date <= CONVERT(datetime, '2017-11-25 11:27:00.000', 121) AND left_dept_date >= CONVERT(datetime, '2018-11-25 11:27:00.000', 121)

当列是正确的日期时,此查询没有语法错误(请参阅http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72d1e1f4fbf1/16114),因此唯一剩下的就是视图代码中的缺陷,执行数据转换 - 对于例如,如果您的视图正在转换字符串&#34; 12/31/2017&#34;进入一个约会,但这样做就像是&#34; dd / mm / yyyy&#34;,或者可能转换为&#34; 2107-12-31&#34;在一年中发生错字,进入一个不支持2079年以后的小时类型

请参阅https://docs.microsoft.com/en-us/sql/t-sql/language-elements/between-transact-sql

答案 1 :(得分:0)

我不确定BETWEEN的语法是否在sql Server 2012中升级了。但看起来你在子句中有语法错误

SELECT * 
FROM aview 
WHERE ( startDate BETWEEN '2017-11-25 11:27:00.000' AND '2018-11-25 11:27:00.000' AND
        leftdate  BETWEEN  '2017-11-25 11:27:00.000' AND '2018-11-25 11:27:00.000' ) OR 
        start_Date <= '2017-11-25 11:27:00.000' AND 
        left_dept_date >= '2018-11-25 11:27:00.000'

答案 2 :(得分:0)

你复制了错误的答案。 BETWEEN语法无效。

然后,如果您想知道记录的范围是否与给定范围重叠,为什么表和查询中有四列?它应该是两个:开始和结束。

SELECT *
FROM aview 
WHERE start <= '2018-11-25T11:27:00.000' AND end >= '2017-11-25T11:27:00.000';

或者,如果您希望记录的整个范围在给定范围内:

SELECT *
FROM aview 
WHERE start >= '2017-11-25T11:27:00.000' AND end <= '2018-11-25T11:27:00.000';

答案 3 :(得分:0)

SELECT *  FROM USERContracts C
WHERE   
(C.UCFromDate > ='2008-01-01' AND C.uCFromDate <='2020-02-06' )
OR (C.UCToDate < ='2008-01-01' AND C.uCToDate >='2020-02-06')

order by USERID