Объявление и использование переменной в инструкции SELECT - PullRequest
0 голосов
/ 23 октября 2018

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

SELECT DATEDIFF(day, DateOut, DateIn) As 'TotalDays',
DATEDIFF(day, DateOut, DateIn)*2 As '2TimesDays',
FROM tablename

Мне было интересно, есть ли другой способ написать это, может быть, есть способ сохранить DATEDIFF(day... внутри переменной и просто написать SELECT @Days As 'TotalDays', @Days*2 As '2TimesDays' From tablename

Я пытался использовать этот метод:
Set @Days = (SELECT DATEDIFF(day, DateOut, DateIn) FROM tablename),
, но из-за наличия нескольких экземпляров в таблице и желания вывести сумму и удвоить для всех экземпляров это не сработало

Мой стол выглядит примерно так

+-------------------------+
| DateIn     | DateOut    |
+-------------------------+ 
| 10/11/2018 | 11/12/2018 |
| 11/13/2018 | 11/14/2018 |
| 12/01/2018 | 12/16/2018 |
| 12/30/2018 | 12/30/2018 |

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

В таком случае вы можете использовать OUTER APPLY, как показано ниже

SELECT dateDif.days As 'TotalDays',
dateDif.days*2 As '2TimesDays',
FROM tablename
OUTER APPLY (SELECT DATEDIFF(day, DateOut, DateIn) days 
             FROM tablename 
             WHERE <conditions>) dateDif
0 голосов
/ 23 октября 2018

Мне нравится использование боковых соединений - apply - для этой цели:

SELECT v.TotalDays, 2 * v.TotalDay as TotalDays_2
FROM tablename t CROSS APPLY
     (VALUES (DATEDIFF(day, DateOut, DateIn)) v(TotalDays);

Несколько советов.Не используйте одинарные кавычки для псевдонимов столбцов.Это может вызвать проблемы в будущем.Используйте только одинарные кавычки для констант строки и даты.

Дайте столбцам (и таблицам и т. Д.) Имена, которые не нужно экранировать - это означает, что они не начинаются с цифры и не включают пробелы.Это облегчает написание и чтение запросов.

0 голосов
/ 23 октября 2018

Вы можете использовать подзапрос:

SELECT
    t.TotalDays,
    t.TotalDays*2 AS [2TimesDays] FROM
    (
        SELECT DATEDIFF(day, DateOut, DateIn) As 'TotalDays'
        FROM tablename
    ) t
...