Вернуть пятницу, если в SQL Server день выходной (суббота-воскресенье) - PullRequest
0 голосов
/ 20 октября 2019

Я храню данные истории как тип даты (2019-10-10) в SQL Server. Я хотел бы проверить и вернуться в пятницу, если день суббота или воскресенье.

Нет данных в выходные дни. Вот почему я хочу получить данные за пятницу, если это выходные.

Ответы [ 6 ]

2 голосов
/ 20 октября 2019

( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1 всегда возвращает целое число от 1 до 7 с 1, соответствующим воскресенью, независимо от значения DateFirst или Language.

. Вы можете использовать следующиекод для отправки дат выходных дней к предыдущей пятнице:

-- 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 голос
/ 20 октября 2019

Самый безопасный метод, вероятно, заключается в использовании 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().

1 голос
/ 20 октября 2019

Один из вариантов - использовать 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
0 голосов
/ 20 октября 2019

Вам нужно обновление, как показано ниже

        Update table set column=(select 
          column
         From table where to_char(date, 
         'Day') ='FRI') where to_char(date, 
         'Day') LIKE 'S%' ;
0 голосов
/ 20 октября 2019

Надеюсь, это поможет:

Создать таблицу для теста:

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

0 голосов
/ 20 октября 2019

Дни равны числам на сервере sql:

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

DATEPART(DW, GETDATE()) дает вам текущий день как число.

Используйте его в IF И ИЛИ в MS SQL сервере.

НА ПРИМЕРЕ:

Если день субботний (6), используйте минус 1 для получения пятницы.

IF(DATEPART(DW, GETDATE()) = 6)
SELECT * FROM table WHERE date=dateadd(day, -1, cast(GETDATE() as date))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...