2009-07-01 144 views

回答

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 
0

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

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

+0

注上BETWEEN:一些(?最重要)的实现是包容性。根据您存储和比较的日期/时间值的粒度,午夜值可能会产生意外结果。 如果这是一个问题,大于/小于号运营商可能是要走的路。 – TSomKes 2009-07-01 04:45:36

1

看来,你需要从过去的几周x直到今天的数据。如果是这样,这应该工作:

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

这里我选择数据从2个星期前,直到现在。

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

这将从今天的日期过去7天。

更改dateadd(day,-7,current_date())语法,无论sysdate分钟7天语法是否在您的数据库风格。

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); 

等。