在SELECT语句中声明和使用变量

时间:2018-10-23 08:46:16

标签: sql sql-server select stored-procedures

我正在尝试创建一个存储过程,该过程可以计算两个日期之间的天数,并且还可以获取该数字的两倍。目前,我的代码看起来像这样

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 :(得分:4)

您可以使用子查询:

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

答案 1 :(得分:1)

在这种情况下,您可以按以下方式使用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

答案 2 :(得分:1)

为此,我喜欢使用横向连接-apply

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

一些建议。列别名不要使用单引号。将来可能会给您带来麻烦。仅对字符串和日期常量使用单引号。

给出不需要转义的列(和表等)名称-这意味着,不要以数字开头并且不包含空格。这使查询更易于编写和阅读。