【问题标题】:SQL setting start date to Friday, and read Data between 2 datesSQL 设置开始日期为星期五,并读取 2 个日期之间的数据
【发布时间】:2017-03-20 22:38:22
【问题描述】:

我正在尝试在 sql 查询中将开始日期设置为星期五。我已经完成了,如下所示。我现在需要做的是显示周五和周六之间的所有 GameID,它每周都会刷新(这样每周都会显示该周内玩过的其他游戏)。

我是 SQL 的初学者,非常感谢任何帮助!

我试过下面的sql查询。

DECLARE @StartFriday datetime
DECLARE @EndSaturday datetime

SET DATEFIRST 6 -- Set the start of the week to Friday

SELECT *
FROM
(

SELECT  GameDate,
        DATEADD(w, 0, DATEADD(w, DATEDIFF(w, 0,GETDATE()), -5)) AS 'StartFriday', 
        DATEADD(w, 0, DATEADD(w, DATEDIFF(w, 0,GETDATE()), 1)) AS 'EndSaturday'

FROM VW_Resultaat_Score 

WHERE GameDate BETWEEN 'StartFriday' AND 'EndSaturday' --Show all GameDates between @StartFriday and @EndSaturday
)

我希望能得到任何帮助!

干杯

【问题讨论】:

  • 首先,SET DATEFIRST 6 将其设置为星期六开始,而不是星期五。您想使用5。其次,你从这个查询中得到了什么?
  • 您的 where 子句试图将日期与两个字符串文字进行比较,这两个文字都不包含日期。至于列别名,我可以提供一些建议阅读:Is it a String Literal or an Alias?.

标签: sql sql-server tsql datediff dateadd


【解决方案1】:

也许这样会更好:

DECLARE @StartFriday datetime
DECLARE @EndSaturday datetime

SET DATEFIRST 6
Set @StartFriday = DATEADD(w, 0, DATEADD(w, DATEDIFF(w, 0,GETDATE()), -5))
Set @EndSaturday = DATEADD(w, 0, DATEADD(w, DATEDIFF(w, 0,GETDATE()), 1))

SELECT *
FROM
(
SELECT  GameDate
FROM VW_Resultaat_Score 
WHERE GameDate BETWEEN @StartFriday AND @EndSaturday
)

【讨论】:

  • 这几乎可以工作,在第二个选择查询之后你添加了一个 , 在 GameDate 之后会给你一个错误。我需要在子选择之后添加一个别名,否则它会给你一个错误。但这确实有效!谢谢!
【解决方案2】:

如果您只需要前一个周末,则此代码将起作用:

SELECT *
FROM VW_Resultaat_Score
WHERE GameDate BETWEEN 
(SELECT DATEADD(d, 1 - datepart(weekday, dateadd(d, 2, getdate())), getdate())) 
AND 
(SELECT DATEADD(d, 1 - datepart(weekday, dateadd(d, 1, getdate())), getdate()))

代码看起来有点疯狂,但它确实有效。如果您可能需要查询其他特定的周末,这可能是一个选项:

DECLARE @getdate date
SET @getdate='2017-05-16'
SELECT *
FROM VW_Resultaat_Score
WHERE GameDate BETWEEN 
    (SELECT DATEADD(d, 1 - datepart(weekday, dateadd(d, 2, @getdate)), @getdate)) 
    AND 
    (SELECT DATEADD(d, 1 - datepart(weekday, dateadd(d, 1, @getdate)), @getdate))

更进一步,您可能需要报告每个周末。以下代码为您提供了 2017 年每周的所有周五周六。

WITH Fri as
(SELECT DATEPART(YEAR,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num)) yyyy, DATEPART(wk,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num)) weeknumber, Fridays = CAST(DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num) as Date)
FROM (SELECT TOP 366 num = ROW_NUMBER() OVER(ORDER BY a.NAME)-1 FROM dbo.syscolumns a, dbo.syscolumns b) n
WHERE DATENAME(weekday, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num)) = 'Friday')
,
Sat as
(SELECT weeknumber=DATEPART(wk,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num)), Saturdays = CAST(DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num) as Date)
FROM (SELECT TOP 366 num = ROW_NUMBER() OVER(ORDER BY a.NAME)-1 FROM dbo.syscolumns a, dbo.syscolumns b) n
WHERE DATENAME(weekday, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), n.num)) = 'Saturday')
Select Fri.weeknumber, fri.yyyy, Fridays, Saturdays
FROM Fri
JOIN Sat on Fri.weeknumber=Sat.weeknumber

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 2019-09-25
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多