3

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

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 中完成)?

4

2 回答 2

1

据我所知,不需要 Date(...) 。这个例子似乎有效

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

顺便说一句,值得用日期时间答案查看这个问题(将在此处发布以节省精力)

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)方法。

于 2012-07-28T00:33:00.023 回答
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 还是存储在定义为字符串的列中?

您可能想查看一个链接!有关可用于字符串变体的日期时间常量的更多详细信息。

于 2012-07-28T00:31:55.640 回答