我在Ms SQL Server
2005(2008)的表中有以下结构
ID Name AddDate AmendDate Status
-----------------------------------------------------------------------
1 Jason 2012-09-03 08:01:00.000 2012-09-03 14:02:00.000 Amended
2 Robert 2012-09-03 08:05:00.000 NULL New
3 Celia 2012-09-03 08:10:00.000 2012-09-03 14:02:00.000 Amended
4 Jason 2012-09-03 14:02:00.000 NULL New
5 Robert 2012-09-03 14:03:00.000 2012-09-03 20:02:00.000 Amended
6 Celia 2012-09-03 14:07:00.000 2012-09-03 20:02:00.000 Amended
7 Jason 2012-09-03 20:00:00.000 NULL New
8 Robert 2012-09-03 20:02:00.000 NULL New
9 Celia 2012-09-03 20:04:00.000 NULL New
例程每天运行三次作为快照,
请问如何使用SQL Query
从任何一天的早晨(或晚上)选择所有记录
如何替换(ISNULL(AmendDate, '2012.09.04')
)列AmendDate
,其中Null value
,在我走历史的情况下,例如返回{{1}的所有行}}
问题仅限于AddDate <= '2012-09-01' and AmendDate >= '2012-09-02'
答案 0 :(得分:1)
对于第一个,您可以使用日期上的DATEPART功能提取小时,并根据您是否对早上或晚上添加的记录感兴趣来应用您的标准。
DATEPART(hh, AddDate) BETWEEN 0 AND 12 -- Morning.
第二个问题不明确:(
答案 1 :(得分:1)
对于2.问题,你想要这样的东西吗?我使用了一个参数,因为它更容易显示:
DECLARE @AddDate datetime
SELECT *
FROM yourTable
WHERE
AddDate <= @AddDate
and AmendDate >= ISNULL(AmendDate,DATEADD(day, 1, @AddDate))
答案 2 :(得分:1)
从任何一天的早/晚选择所有记录
select *
from Table t
where t.AddDate > '2012-09-03'
and t.AddDate < '2012-09-04'
and DatePart(HOUR, t.AddDate) < 12 -- Morning
-- and DatePart(HOUR, t.AddDate) > 18 -- Evening
对于第二部分(鉴于要求不是很清楚),我认为你可以使用CTE
Coalesce
函数
;WITH FullData(Id, Name, AddDate, AmendDate, Status)
AS (SELECT t.Id,
t.Name,
t.AddDate,
COALESCE(t.AmendDate, '2012-09-04'),
Status
FROM Table t)
SELECT *
FROM FullData d
WHERE d.AddDate <= '2012-09-01'
AND t.AmendDate >= '2012-09-02'