Объявите переменную, которая преобразует тип данных даты в целое число

#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