SQL转换/转换问题

时间:2013-07-11 17:07:13

标签: sql sql-server casting

这更像是专家的帮助,而不是问题。我需要声明一个名为BillingYear的变量,我可以将它分配给一年。问题是:

我不知道它应该是哪种数据类型!我知道这很简单,但问题是,在我们的数据库中,我们没有年份专栏。我们有一个叫财政年度的东西,从07/01 /任何一年开始 - 到06/30 / nextyear结束

我想找到一种方式,我输入一年,年份将被添加到财政开始,fiscalend变量,它们是日期时间变量。我试过了,但它没有用!

DECLARE
@Year int, --Here I thought I can assign year to any year then do the following:

DECLARE
@fiscalstart datetime = '07/01/' + @Year,
@fiscalend datetime = '06/30/' + @Year+1

然后我可以用它来计算billingMonth,通过billingMonth = fn_Fiscal(@fiscalstart,@ fiscalend)//你真的不需要知道这个部分,但我只想告诉你为什么我需要做所有这些复杂的步骤。 解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

首先,您需要确保将尝试投射到日期时间的字符串放在正确的format中。然后你需要将年变量转换为字符串,否则你会得到类型不匹配。以下是一些例子。

DECLARE @year INT
SET @year = 2012

DECLARE @debugDate1 DATETIME
SET @debugDate1 = '07/01/' + CAST(@year AS VARCHAR(MAX)) + ' 00:00:00'
SELECT @debugDate1

DECLARE @debugDate2 DATE
SET @debugDate2 = '07/01/' + CAST(@year AS VARCHAR(MAX))
SELECT @debugDate2

答案 1 :(得分:1)

@fiscalstart和@fiscalend被定义为日期时间,因此您设置它们的对象必须是日期时间。

你正在取一个字符串'07 / 01 /'并试图为它添加一个整数。这不起作用。

你需要做类似的事情:

SET @fiscalstart = '07/01/' + CAST(@Year as VARCHAR)

答案 2 :(得分:1)

如果您使用的是Sql Server 2012,则可以使用它(测试 here ):

SELECT DATEFROMPARTS (2010, '07', '01' ) AS Result;

有关详细信息,请参阅 link

DATEFROMPARTS(年,月,日)
DATEFROMPARTS返回日期值,日期部分设置为指定的年,月和日,时间部分设置为默认值。如果参数无效,则会引发错误。如果必需参数为null,则返回null。

答案 3 :(得分:1)

不要在字符串中添加int,最好使用DMY订单不可知格式,例如yyyymmdd;

DECLARE @Year int = 2013
DECLARE @fiscalstart datetime = cast(@Year as varchar(4)) + '0701'