Sql server SQL Server:返回去年的最后一天
看看这个代码部分Sql server SQL Server:返回去年的最后一天,sql-server,tsql,Sql Server,Tsql,看看这个代码部分 DECLARE @SQL VARCHAR(MAX), @DateWithDotsVARCHAR(10) SELECT @DateWithDots = REPLACE(@Date, '-', '.') IF OBJECT_ID('tempdb..##WL_Klijenti') IS NOT NULL DROP TABLE ##WL_Klijenti SELECT @SQL = ' SELECT * INTO ##WL_Klijenti
DECLARE @SQL VARCHAR(MAX), @DateWithDotsVARCHAR(10)
SELECT @DateWithDots = REPLACE(@Date, '-', '.')
IF OBJECT_ID('tempdb..##WL_Klijenti') IS NOT NULL
DROP TABLE ##WL_Klijenti
SELECT @SQL = '
SELECT *
INTO ##WL_Klijenti
FROM OPENROWSET (''SQLOLEDB'',''Server=
(local);TRUSTED_CONNECTION=YES;'',''SET FMTONLY OFF; SET NOCOUNT ON;
EXEC
'+DB_NAME()+'.dbo.sp_kbbl_WachLista_Priprema ''''' + @DateWithDots+
''''', ''''' + @DateWithDots + ''''', 0'')
AS tbl'
... the rest is less important
不需要作为用户输入,但这里我必须通过
去年的最后一天用户将输入第一个@dateWithDots。
(这是由于一些资产负债表计算,这里一切正常,我只需设置此调整。)
因此,我必须事先确定当前年份,year
可以从第一个@DateWithDots
获取,因为这是请求的用户输入参数
如何做到这一点
解决方案: @酷_Br33ze的方法
DECLARE @dateWithDots NVARCHAR(10)
SET @dateWithDots = '2018.01.18' --<< User Inputted date
SELECT LastDayLastYear = CAST(DATEADD(YEAR,
DATEDIFF(YEAR, -1, CAST(@dateWithDots AS DATE) )-1, -1) AS DATE)
DECLARE @LastDay VARCHAR(MAX)
SET @LastDay = CONVERT(VARCHAR(4),SUBSTRING(@Datum,1,4)-1) + '.12' + '.31';
使用正确的日期数据类型
DECLARE @dateWithDots DATE
SET @dateWithDots = GETDATE() --<< User Inputted date
SELECT LastDayLastYear = CAST(DATEADD(YEAR,
DATEDIFF(YEAR, -1, @dateWithDots )-1, -1) AS DATE)
DECLARE @dateWithDots NVARCHAR(10)
SET @dateWithDots = '2018.01.18' --<< User Inputted date
SELECT LastDayLastYear = CAST(DATEADD(YEAR,
DATEDIFF(YEAR, -1, CAST(@dateWithDots AS DATE) )-1, -1) AS DATE)
返回
2017-12-31
--使用动态SQL-NVARCHAR优于VARCHAR
DECLARE @SQL NVARCHAR(MAX) ;
SET @SQL = N'SELECT CAST(DATEADD(YEAR,DATEDIFF(YEAR, -1, CAST(@dateWithDots AS DATE) )-1, -1) AS DATE)'
EXEC sys.sp_executesql @SQL, N'@dateWithDots NVARCHAR(10)', @dateWithDots
首先,您不需要动态SQL。第二,如果您创建了一个链接服务器,那么会容易得多。事实上,查询几乎无法读取。最后,所有这些与检索上一年的12月31日有什么关系?只需获取GETDATE()的年份部分并减去一。对日期使用正确的数据类型,如
DATE
或DATETIME
notVARCHAR
这都是一个过程的一部分,一切都很好,除了我必须将第二个日期作为去年的最后一天传递外,这里不需要更改任何内容,一些平衡计算。这就可以了,谢谢。如何将其传递给select@SQL语句?它必须在其中执行。还有一件事,我需要返回与@dateWithDots用户输入相关的去年最后一天。如何从用户输入中提取年份?如下所示:设置@lastDay=year(@DatumSaTackama);选择DATEADD(年份,DATEDIFF(年份,-1,@lastDay)-1,-1);现在,我如何将它传递给@Sql语句?@T_Dejan我已经包含了一个动态Sql示例