SQL:检索所有数据库中日期之间的记录

时间:2012-07-27 23:48:42

标签: sql sql-server datetime

我想在两个日期之间选择表格中的所有记录。我有一个查询:

SELECT * FROM <table> WHERE (thedate BETWEEN DATE('2012-04-01') AND DATE('2012-06-30'))

这适用于HSQL,Oracle,PostgreSQL,但由于缺少Date函数,它在SQL Server中不起作用。有没有办法让这个通常适用于所有数据库(包括SQL Server),或者我是否需要使用像Hibernate这样的ORM(我知道我应该这样做,但我特别要问这是否可以在SQL中完成)? / p>

2 个答案:

答案 0 :(得分:1)

据我所知,没有必要使用日期(...)。这个例子似乎有用

DECLARE @TheDate Date = '2012-07-01';

SELECT 'hello' WHERE (@TheDate BETWEEN '2012-04-01' AND '2012-06-30')
--None returned
SET @TheDate = '2012-05-01'

SELECT 'hello' WHERE (@TheDate BETWEEN '2012-04-01' AND '2012-06-30')
--selects hello

修改 Btw值得用This Question查看日期时间答案(此处仅发布以节省工作量)

between语句可能会导致日期范围边界出现问题

BETWEEN '01/01/2009' AND '01/31/2009'

实际上被解释为

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00'

因此将错过1月31日当天发生的任何事情。在这种情况下,您将不得不使用:

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00'  --CORRECT!

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!)

更新:完全有可能在当天的最后一秒创建记录,日期时间晚于01/01/2009 23:59:59.997 !!

出于这个原因,不建议使用BETWEEN (firstday) AND (lastday 23:59:59)方法。

改为使用myDate >= (firstday) AND myDate < (Lastday+1)方法。

答案 1 :(得分:0)

在sql-server中我想你可能想看一下

DATEADD ( datepart , number, date )
DATEDIFF ( datepart , startdate , enddate )

但我认为你正在寻找

CAST ( expression AS data_type )

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

用法:

Select * from myTable where  thedateToCompare >= CONVERT ( datetime , "dd/mm/yy hh:mi:ss:mmmAM" ) and thedateToCompare <= CONVERT ( datetime , "dd/mm/yy hh:mi:ss:mmmAM" ) 

可能会改变您的方法的是天气源'thedate'列类型datetime,smalldatetime还是存储在定义为字符串的列中?

您可以查看a link!对于可以用于字符串变体的日期时间常量的更多信息。