#sql #sql-server #variables #declare
Вопрос:
В SQL Server следующий код дает мне дату воскресенья на прошлой неделе, независимо от того, какая сегодня дата:
DECLARE @dt date = GETDATE();
SELECT dateadd(week,datediff(week,6,@dt),6);
Мне нужно объявить переменную с указанной даты и сделать эту переменную целым числом. Я пробовал такие вещи, как:
DECLARE @last_sunday INT;
SELECT dateadd(week,datediff(week,6,@dt),6) INTO @last_sunday FROM xxx;
Но проблема в том, что я не понимаю, из какой таблицы мне следует писать. В моей интерпретации строка:
dateadd(week,datediff(week,6,@dt),6)
это своего рода вычисление, а не сбор значения из таблицы данных. Как я могу преобразовать дату прошлого воскресенья в переменную, которая является целым числом?
Комментарии:
1. просто
declare @last_sunday int = dateadd(...);
. если таблицы нет, зачем пытаться включить ее??2. sql server не требует
FROM
3. ваша проблема, похоже, заключается в использовании
select
, когда вы на самом деле не выбираете из какой-либо таблицы. просто используйтеdeclare @last_sunday int = foo()
или отдельно объявите, а затемset @last_sunday = foo()
.4.
SELECT...INTO
для переменных тоже не работает.SELECT...INTO
берет набор данных, создает таблицу, используя определение набора данных, а затем вставляет эти данные в указанную новую таблицу. У вас нетCREATE
переменной (табличного типа), у васDECLARE
есть она. Это, безусловно, не будет работать со скалярной переменной.
Ответ №1:
Тебе нужно сделать что-то вроде этого:
Шаг 1
DECLARE @date DATE = dateadd(week,datediff(week,6,GETDATE()),6)
Шаг 2
DECLARE @dateInt AS INT = REPLACE(@date, '-', '')
На первом шаге вы получаете правильное значение даты в типе данных даты. Учитывая, что дата содержит дефисы, затем вы используете REPLACE
функцию на шаге 2, чтобы удалить их и в то же время преобразовать дату в целое значение.
Наконец, чтобы убедиться, что шаги 1 и 2 работают, вы можете выполнить следующий запрос:
SELECT @dateInt
На сегодняшний день это даст вам следующее значение: 20210530
Комментарии:
1. Спасибо @Michele La Ferla за то, что дали мне полный ответ, а не, как в комментариях, указали, что я неправ. Я знаю, что ошибаюсь, иначе зачем бы я задавал вопрос о stackoverflow? : В любом случае, это сработало именно так, как я хотел, большое спасибо! 😀
2. @chilifan комментарии не просто указывают на то, что ваш запрос был неправильным, они также объясняют, почему он неправильный, и предоставляют альтернативы, которые действительно работают.
3. Также обратите внимание, что этот ответ зависит от локальных настроек, поскольку
@date
неявно преобразуется в строку. И не на каждой машине неявно преобразованное значение будет содержать тире.4. Я знаю, что комментарии также пытались предложить решения, но все они создавали для меня больше сообщений об ошибках. Я просто поддерживаю ту, которая решила мою проблему 🙂
Ответ №2:
Чтобы облегчить жизнь, onw также может создать функцию:
CREATE FUNCTION LastSunday ()
RETURNS int
AS
BEGIN
RETURN convert(int,dateadd(week,datediff(week,6,getdate()),6))
END
GO
После этого вы можете сделать:
select dbo.LastSunday();
Что (сейчас 3th jun 2021
) приведет к: 44344
Комментарии:
1. это не то, чего он хочет , потому что нет буквальной корреляции между значением даты и целым
44344
числом, в том смысле, что целое число не имеет логического смысла.2. Нет никакой корреляции между числом
20210530
и датой2021-05-30
. Первое-это просто случайное число, а второе-данные за прошлое воскресенье), что, по сути, является датой рондома….3. конечно, здесь есть корреляция. Очевидно, что в этом гораздо больше смысла, чем
44344
Ответ №3:
простейший запрос:
select cast(replace(cast(getdate() as date),'-','') as int) as DateToInteger