Оператор WHERE, чтобы выбрать запись предыдущего дня, но выбрать запись пятницы, когда текущий день - понедельник Microsoft SQL - PullRequest
0 голосов
/ 22 марта 2019

Мне нужен оператор WHERE, где дата записи - предыдущий день. У меня есть код ниже, который будет делать это

WHERE DOC_DATE =  dateadd(day,datediff(day,1,GETDATE()),0) 

Однако мне нужно это заявление, чтобы получить пятничный рекорд, когда текущий день - понедельник. У меня есть код ниже, но он не будет работать для меня. Ошибки не возвращаются в SQL, хотя результаты записей также не возвращаются. У меня есть код ниже для этого

WHERE DOC_DATE = DATEADD(day, CASE WHEN datepart(dw,(GETDATE())) IN (2) then -3 ELSE -1 END ,0)

Важно добавить, что это должно быть в предложении WHERE. Это для административного представления Docuware, которое я создаю. У меня нет контроля над тем, как написать оператор SELECT, у меня есть доступ только к редактированию предложения WHERE:

* +1012 *enter image description here

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вот немного «волшебный» способ вычисления значения, которое не зависит от каких-либо конкретных настроек сервера, таких как datefirst.Вероятно, не сразу очевидно, как это работает:

WHERE DOC_DATE = dateadd(day,datediff(day,'20150316',getdate()),
CASE WHEN DATEPART(weekday,getdate()) = DATEPART(weekday,'20150330')
    THEN '20150313'
    ELSE '20150315' END)

В первой строке мы вычисляем количество дней, прошедших с некоторой произвольной даты.Я выбрал день в марте 2015 года для использования в качестве базовой даты.

Во второй строке задается вопрос о том, какой сегодня день недели, и совпадает ли он с каким-то произвольным «известным хорошим» понедельником.Просто взять одно значение и сравнить его с 2, зависит от того, какое у вас значение DATEFIRST, поэтому я предпочитаю не записывать это.

В третьей строке мы решаем, что делать, если это понедельник - ядать дату, которая за 3 дня до моей произвольной даты выше.Если это не был понедельник, мы выбираем день раньше.

Сложив все это вместе, когда мы добавляем разницу в днях от произвольной даты обратно к одной из этих двух дат из строк 3 и 4, она имеетэффект смещения даты назад на 1 или 3 дня.


Это может быть странная структура, если вы не знакомы с ней - но объединение dateadd / datediff и использование отношениймежду произвольной датой и другими датами, вычисленными по ней, может быть полезным для выполнения всех видов вычислений.Аналогичная структура может использоваться для вычисления, например, последнего дня месяца 15 месяцев назад, используя просто dateadd / datediff, произвольную дату и другую дату с правым смещением от первого:

SELECT DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'19991031')

Однако, как я уже сказал в комментарии, обычно выполнение такого рода действий является лишь небольшим шагом от необходимости правильно моделировать рабочие дни вашей организации, после чего вы, как правило, захотите представить таблицу календаря.На одну строку в день предварительно рассчитанный календарь на 20 лет (при необходимости корректируемый по мере изменения бизнеса) по-прежнему меньше 10000 строк.

0 голосов
/ 22 марта 2019

Вы можете попробовать это.

WHERE DOC_DATE = DATEADD(DAY, CASE WHEN datepart(dw, GETDATE()) = 2 THEN -3 ELSE -1 END, CAST(GETDATE() AS DATE)) 
...