SQL查询日期条件

时间:2012-09-04 07:16:24

标签: sql sql-server

我在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

  1. 从任何一天的早晨(或晚上)选择所有记录

  2. 如何替换(ISNULL(AmendDate, '2012.09.04'))列AmendDate,其中Null value,在我走历史的情况下,例如返回{{1}的所有行}}

  3. 问题仅限于AddDate <= '2012-09-01' and AmendDate >= '2012-09-02'

3 个答案:

答案 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'