如何在BETWEEN sql server中排除上限

时间:2011-12-29 11:34:27

标签: sql-server-2008 ibatis

我使用SQL Server作为我的数据库。我正在搜索输入日期的行。这意味着搜索submission_date正好'12/13/2011'的行。首先,我将搜索条件日期转换为毫秒

Dec 13 2011 00:00:00 ='1323727200000'
Dec 14 2011 00:00:00 ='1323813600000'`

SELECT * 
FROM log_file 
WHERE submission_date BETWEEN '1323727200000' AND '1323813600000' 

此查询会搜索Dec 13 MidnightDec 14 Midnight,但我想跳过上限值,即从Dec 13 2011 00:00:00Dec 13 2011 59:59:59。为此,我想使用>= and <。这是一种正确的方法吗?

完成此操作后,我有一个iBatis xml,我正在编写以下内容,这给了我错误。

<isNotEmpty prepend="AND" property="submissiondate">
   submission_date <![CDATA[ >= ]]> #submissiondate # AND <![CDATA[ < ]]> #submissiondate #
</isNotEmpty>

请建议这是否正确。

由于

3 个答案:

答案 0 :(得分:4)

是的,您通常会使用>=<进行时间/日期范围查询

或者,您可以从上限减去3毫秒,以获得当天的最高日期时间(而不是更新的datetime2)值xxx 23:59.59.997

SELECT * FROM   log_file
WHERE  submission_date BETWEEN 1323714600000 AND 1323801000000-3

注意:如果一切都是毫秒......减去1可能就行了。

编辑,为什么3ms的例子

SELECT 
    DATEADD(millisecond, -1, '20111214'), -- 2011-12-14 00:00:00.000
    DATEADD(millisecond, -2, '20111214'), -- 2011-12-13 23:59:59.997
    DATEADD(millisecond, -3, '20111214')  -- 2011-12-13 23:59:59.997

有趣的是,你确定这是午夜吗? 对于1323813600秒,我得到2011-12-13 22:00:00

在SQL Server上:

SELECT DATEADD(second, 1323813600, '19700101') 

关于MySQL

SELECT FROM_UNIXTIME(1323813600)

答案 1 :(得分:2)

在您的情况下,“日期”似乎是BIGINT类型,为什么不从上限间隔中减去1?

SELECT * FROM log_file 
WHERE submission_date BETWEEN 1323714600000 AND 1323801000000 - 1

当然,这不适用于浮点数或小数......

答案 2 :(得分:1)

是的,如果你必须跳过上限 - 你应该使用

WHERE Date >= '20111213' AND Date < '20111214'

当然 - 如果你的专栏类型是DATETIME