SQL Server复合查询

时间:2013-05-31 19:28:50

标签: sql-server

您好,感谢您的光临。

我为垒球队写了一个简单的应用程序,我在重写时需要查询一些问题。

SELECT DISTINCT 
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
    _Schedule
WHERE
    (_StartDate >= DATEADD(wk, 0, { fn NOW() })) 
    AND (_StartDate < DATEADD(wk, 1, { fn NOW() }))

此查询只是获得即将到来的周游戏时间表。我需要做的并且我已经忘记了,我还要查看_RescheduleDates我们目前有1或2个重新安排的游戏。所以我需要修改它来检查重新安排日期是否有一个有效的日期,而不是“TBD”或NULL。

第二个问题是,我们的游戏是在星期五,在游戏当天,这会将网站上的数据更改为下周的游戏,我需要它才能改变,直到星期六游戏后的第二天。我试着加1天

(wk, 1 +1d {fn NOW() })) 

但显然这不起作用。所以我肯定会对此有所帮助。

4 个答案:

答案 0 :(得分:1)

select
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
from (
    select distinct
        _NewDate = coalesce(nullif(_RescheduleDate,'TBD'),_StartDate)
        ,_StartDate
        ,_RescheduleDate
        ,_GameTime
        ,_FieldNumber
        ,_Notes
        from _Schedule
    ) sch
where (_NewDate >= cast(getdate() as date))
    and (_NewDate < dateadd(wk, 1, getdate()))  

您的“游戏提前一天下降”问题是因为您将当前时间与日期进行比较 - 因此时间组件被假定为00:00:00.000。这就是为什么你会看到反对在单独的列中存储开始日期和开始时间的建议。请注意,cast(getdate() as date)需要SQL 2008或更高版本;使用cast(floor(cast(getdate() as float)) as datetime)获取早期版本。

http://sqlfiddle.com/#!3/9d171/5/0

答案 1 :(得分:0)

您能否向我们展示设置所需的结果:

declare @_Schedule table (_StartDate datetime, _RescheduleDate datetime, _GameTime datetime, _FieldNumber int, _Notes varchar(10))
insert into @_Schedule
    select '2013-05-31', null,          '10:30:00', 1, '...' union all
    select '2013-06-02', '2013-06-03',  '10:30:00', 1, '...' union all
    select '2013-06-04', null,          '10:30:00', 1, '...' union all
    select '2013-06-05', null,          '10:30:00', 1, '...'


SELECT DISTINCT 
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
    @_Schedule
WHERE
    (_StartDate >= DATEADD(wk, 0, getdate())) 
    AND (_StartDate < DATEADD(wk, 1, getdate()))

答案 2 :(得分:0)

当您“检查”_RescheduleDate值时需要发生什么?

如果您只想对重新安排的游戏进行其他查询,以便在网站的单独页面或部分中进行此操作,只需修改WHERE子句

SELECT DISTINCT 
  _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
  _Schedule
WHERE
  (_StartDate >= DATEADD(wk, 0, { fn NOW() })) 
  AND (_StartDate < DATEADD(wk, 1, { fn NOW() }))
  AND _RescheduleDate IS NOT NULL
  AND _RescheduleDate <> 'TBD'

否则,CASE语句将能够在选择值时“检查”该值。

SELECT DISTINCT 
    _StartDate
, CASE 
     WHEN _RescheduleDate IS NULL THEN ''
     WHEN _RescheduleDate = 'TBD' THEN '' 
     ELSE --do something with the valid datetime 
  END AS _RescheduleDate
, _GameTime, _FieldNumber, _Notes

答案 3 :(得分:0)

我有点想把它包含在当前的声明中。我知道我可能不确定如何去做。时间表页面需要显示要播放的所有游戏,包括常规预定游戏和重新安排的游戏。

内森,我认为你正在做些什么......选择像数据格式这样的结果&#39;重新安排的游戏。你知道如何创建复合选择语句吗?我试图在网上找到一个例子,但尚未找到适用的例子。