我在表格中有一个带有日期时间数据类型的“LOGTS”列,我想选择我在“上周”,“2周前”等范围内的记录!我该怎么做?
答案 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)
显而易见的DATEADD
和DATEDIFF
答案经常会忘记时间组件,它需要与您在一天或一周开始时的定义相匹配(例如,周日午夜或周一早上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)
在您的查询中,您可以使用“between”运算符或简单的大于/小于运算符来查询数据。
答案 4 :(得分:0)
SELECT * FROM myData
where LOGTS > dateadd(day,-7,current_date())
从今天起,这将是过去7天。
将dateadd(day,-7,current_date())
语法更改为数据库风格的sysdate分钟7天语法。