如果一天是SQL Server中的周末(星期六-星期日),则返回星期五

时间:2019-10-20 15:36:55

标签: sql sql-server database tsql

我将历史记录数据作为日期类型(2019-10-10)存储在SQL Server中。如果一天是星期六或星期日,我想检查一下并返回星期五。

周末没有数据。这就是为什么我想在周末获取星期五的数据。

6 个答案:

答案 0 :(得分:2)

( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1将始终从17返回一个整数,其中1对应于星期日,而不管DateFirstLanguage的设置如何

您可以使用以下代码将周末日期推回到上一个星期五:

-- Get the current date (without time).
declare @Today as Date = GetDate();
-- Move Saturday or Sunday dates back to the prior Friday.
select @Today as Today,
  case ( @@DateFirst + DatePart( weekday, @Today ) - 1 ) % 7 + 1
    when 1 then DateAdd( day, -2, @Today ) -- Sunday.
    when 7 then DateAdd( day, -1, @Today ) -- Saturday.
    else @Today end as ReportDate;

答案 1 :(得分:1)

一种选择是将Choose()DateAdd()一起使用 示例

示例

Declare @YourTable table (DateCol date)
Insert Into @YourTable values
 ('2019-10-14')
,('2019-10-15')
,('2019-10-16')
,('2019-10-17')
,('2019-10-18')
,('2019-10-19')
,('2019-10-20')

Select DateCol
      ,ActDay  = datename(WEEKDAY,DateCol)
      ,AdjDay  = dateadd(DAY,choose(DatePart(WEEKDAY,DateCol),-2,0,0,0,0,0,-1),DateCol)
 From  @YourTable

返回

DateCol     ActDay      AdjDay
2019-10-14  Monday      2019-10-14
2019-10-15  Tuesday     2019-10-15
2019-10-16  Wednesday   2019-10-16
2019-10-17  Thursday    2019-10-17
2019-10-18  Friday      2019-10-18
2019-10-19  Saturday    2019-10-18  << Friday's Date
2019-10-20  Sunday      2019-10-18  << Friday's Date

答案 2 :(得分:1)

最安全的方法可能是在星期几使用format()

select (case format(col, 'ddd', 'en-us')
           when 'Sat' then dateadd(day, -1, col)
           when 'Sun' then dateadd(day, -2, col)
           else col
        end)

由于格式采用了区域性参数,因此无论设置如何影响日期格式或datename()返回的语言,该设置均有效。

答案 3 :(得分:0)

希望这会有所帮助:

创建测试表:

create table HistorySave(Datum date);

插入一些测试值:

Insert into HistorySave values (CONVERT(DATETIME, '2012-06-05', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-04', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-03', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-09', 102));

检查所插入数据中的日期

SELECT DATENAME(DW, CONVERT(DATETIME, DATUM, 102)) FROM HistorySave;

在更新之前检查数据:

select * from HistorySave;

更新声明:

UPDATE HistorySave  
SET Datum = 
    CASE  
        WHEN DATENAME(DW, CONVERT(DATETIME, Datum, 102)) = 'Saturday' 
            THEN (CONVERT(DATETIME, Datum, 102) -1)
        WHEN DATENAME(DW, CONVERT(DATETIME, Datum, 102)) = 'Sunday' 
            THEN (CONVERT(DATETIME, Datum, 102) -2)
        ELSE 
            DATUM
    END 

更新后检查数据:

select * from HistorySave;

演示:

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=358aaefe516da8dd96e1da73ce4d5f38

答案 4 :(得分:0)

您需要进行以下更新

        Update table set column=(select 
          column
         From table where to_char(date, 
         'Day') ='FRI') where to_char(date, 
         'Day') LIKE 'S%' ;

答案 5 :(得分:-1)

天数等于sql服务器中的数字:

7 -> Sunday
1 -> Monday
2 -> Tuesday
3 -> Wednesday
4 -> Thursday
5 -> Friday
6 -> Saturday

DATEPART(DW, GETDATE())为您提供当日的数字。

在ms sql服务器的IF AND ELSE中使用它。

例如:

如果天是星期六(6),请用负1表示星期五。

IF(DATEPART(DW, GETDATE()) = 6)
SELECT * FROM table WHERE date=dateadd(day, -1, cast(GETDATE() as date))