我正在尝试创建一个存储过程,该过程可以计算两个日期之间的天数,并且还可以获取该数字的两倍。目前,我的代码看起来像这样
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 |
答案 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);
一些建议。列别名不要使用单引号。将来可能会给您带来麻烦。仅对字符串和日期常量使用单引号。
给出不需要转义的列(和表等)名称-这意味着,不要以数字开头并且不包含空格。这使查询更易于编写和阅读。