简体   繁体   English

SQL-如何按日期选择特定日期时间之前的日期?

[英]SQL - How to select a date by day before a specific datetime?

For example, lets say I have 5/2/2015 as my end point. 例如,假设我将5/2/2015作为终点。 And I want to know the max(Thursday) before my end point. 我想知道终点之前的max(Thursday) How can I end at 4/30/2015 . 我如何在4/30/2015结束。 Also for this I do not have a column to select from. 同样为此,我没有一列可供选择。

So my whereclause needs to specify '5/2/2015' 所以我的子句需要指定'5/2/2015'

sql 2012 SQL 2012

You can try using this While loop to achieve what you're after: 您可以尝试使用以下While循环来实现自己的目标:

Declare @Date date = '2015-05-02'
While DATENAME(WEEKDAY,@Date) <> 'Thursday'
    begin
    Set @Date = DATEADD(dd, -1,@Date)
    end
Select @Date

You can use the WEEKDAY function 您可以使用WEEKDAY函数

SELECT TOP 1 column FROM table
WHERE WEEKDAY(column) = 5 AND column<'2015-05-02'
ORDER BY column DESC

If you need to run this as part of a SELECT, you can use the following: 如果需要将其作为SELECT的一部分运行,则可以使用以下命令:

SELECT 
    CAST(DATEADD(DAY, 
      CASE 
        WHEN DATEPART(WEEKDAY, GETDATE()) >= 5 
        THEN 5 - DATEPART(WEEKDAY, GETDATE())
        ELSE ((-2 - DATEPART(WEEKDAY, GETDATE()))) 
      END, GETDATE()) AS DATE) AS PreviousThursday

With sample data: 带有样本数据:

DECLARE @Sample TABLE
    (
        theDate DATETIME
    )

INSERT  @Sample
SELECT  '20100805' UNION ALL    -- Thursday
SELECT  '20100806' UNION ALL    -- Friday
SELECT  '20100807' UNION ALL    -- Saturday
SELECT  '20100808' UNION ALL    -- Sunday
SELECT  '20100809' UNION ALL    -- Monday
SELECT  '20100810' UNION ALL    -- Tuesday
SELECT  '20100811' UNION ALL    -- Wednesday
SELECT  '20100812' UNION ALL    -- Thursday
SELECT  '20100813' UNION ALL    -- Friday
SELECT  '20100814'      

SELECT 
    DATENAME(WEEKDAY, thedate), 
    thedate, 
    DATEADD(DAY, 
      CASE 
        WHEN DATEPART(WEEKDAY, theDate) >= 5 
        THEN 5 - DATEPART(WEEKDAY, theDate)
        ELSE ((-2 - DATEPART(WEEKDAY, theDate))) 
      END, theDate)
FROM @Sample

With a variable: 带有变量:

DECLARE @TheDate DATETIME = '5/2/2015'

SELECT 
    DATEADD(DAY, 
      CASE 
        WHEN DATEPART(WEEKDAY, @TheDate) >= 5 
        THEN 5 - DATEPART(WEEKDAY, @TheDate)
        ELSE ((-2 - DATEPART(WEEKDAY, @TheDate))) 
      END, @TheDate) AS PreviousThursday

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM