如何根据日期范围从数据库中选择记录?

时间:2009-07-01 04:13:10

标签: asp.net sql-server datetime

我在表格中有一个带有日期时间数据类型的“LOGTS”列,我想选择我在“上周”,“2周前”等范围内的记录!我该怎么做?

5 个答案:

答案 0 :(得分:1)

SELECT * from table WHERE LOGTS > '2009-01-01';

的工作原理。推断。你也可以施展它:

SELECT CAST('1900-01-04 00:00' AS datetime);

我在这里假设SQL Server使用T-SQL。他们有functions的做法,比如获取当前时间并增加负7天。

SELECT * from table WHERE logts > DATEADD(day, -7, CURRENT_TIMESTAMP);

此外,如果您索引LOGTS列,它会有所帮助。

而且,当您将上述查询的执行计划与下面的查询执行计划进行比较时,我相信您会发现上述问题更简单,更快捷。

SELECT * FROM aTable WHERE DATEDIFF(week, LOGTS, GETDATE()) <= 2

答案 1 :(得分:1)

您希望过去几周的数据直到今天。如果是这种情况,这应该有效:

SELECT * FROM aTable WHERE DATEDIFF(week, LOGTS, GETDATE()) <= 2

我在这里选择2周前到现在的数据。

答案 2 :(得分:1)

显而易见的DATEADDDATEDIFF答案经常会忘记时间组件,它需要与您在一天或一周开始时的定义相匹配(例如,周日午夜或周一早上8点),否则就是早期的行在第一天将被错过(比如在上午9点和下午2点运行时给出不同的结果)。

这些舍入计算将找到不同的时间点:

SET NOCOUNT ON;
DECLARE @pointInTime datetime;
SET @pointInTime= GETDATE();

SELECT
    @@DATEFIRST AS FirstDayOfWeek,
    DATEADD(hour, DATEDIFF(hour, 0, @pointInTime), 0) AS StartOfHour,
    DATEADD(day, DATEDIFF(day, 0, @pointInTime), 0) AS StartOfDay,
    DATEADD(day, DATEDIFF(day, 1, @pointInTime), 0) AS Yesterday,
    DATEADD(day, DATEDIFF(day, -1, @pointInTime), 0) AS Tomorrow,
    DATEADD(day, 1 - DATEPART(weekday, @pointInTime), DATEADD(day,
            DATEDIFF(day, 0, @pointInTime), 0)) AS StartOfThisWeek,
    DATEADD(day, 1 - DATEPART(weekday, @pointInTime), DATEADD(day,
            DATEDIFF(day, 7, @pointInTime), 0)) AS StartOfPreviousWeek,
    DATEADD(month, DATEDIFF(month, 0, @pointInTime), 0) AS StartOfMonth,
    DATEADD(quarter, DATEDIFF(quarter, 0, @pointInTime), 0) AS StartOfQuarter,
    DATEADD(year, DATEDIFF(year, 0, @pointInTime), 0) AS StartOfYear,
    DATEADD(hour, 8, DATEADD(day, DATEDIFF(day, 0,
           @pointInTime), 0)) AS StartOfBusinessDay_8am,
    DATEADD(month, 6, DATEADD(year, DATEDIFF(year, 0,
           @pointInTime), 0)) AS StartOfFiscalYear_July1st;

因此,根据您的需要,您对“本周”的比较(假设周从周日午夜开始)是:

SELECT * FROM MyTable WHERE
    (LOGTS >= DATEADD(day, 1 - DATEPART(weekday, GETDATE()),
            DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))

这也假设LOGTS使用当地时间;如果使用GMT / UTC将GETDATE()更改为GETUTCDATE()。

就个人而言,我会将日期计算分配给变量并直接在比较中使用它们;看起来更清洁。

此外,任何datetime范围都应使用半开范围进行比较,以避免分数次回合问题;也就是说,大于或等于开始/较旧时间并且小于(不小于或等于)结束/较新时间。 BETWEEN在这里不起作用。

因此对于“上周”范围内的记录,使用上面的命名值:

SELECT ... WHERE (LOGTS >= StartOfPreviouWeek) AND (LOGTS < StartOfThisWeek);

等等。

答案 3 :(得分:0)

dlamblin的回答是个好的开始。大多数数据库都有getdate()函数和dateadd()函数,您可以使用它来创建您正在寻找的偏移量。将getdate()的结果存储在变量中,然后使用dateadd()创建相对于当前日期的范围。

在您的查询中,您可以使用“between”运算符或简单的大于/小于运算符来查询数据。

答案 4 :(得分:0)

SELECT * FROM myData 
where LOGTS > dateadd(day,-7,current_date())

从今天起,这将是过去7天。

dateadd(day,-7,current_date())语法更改为数据库风格的sysdate分钟7天语法。