Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:返回去年的最后一天_Sql Server_Tsql - Fatal编程技术网

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
not
VARCHAR
这都是一个过程的一部分,一切都很好,除了我必须将第二个日期作为去年的最后一天传递外,这里不需要更改任何内容,一些平衡计算。这就可以了,谢谢。如何将其传递给select@SQL语句?它必须在其中执行。还有一件事,我需要返回与@dateWithDots用户输入相关的去年最后一天。如何从用户输入中提取年份?如下所示:设置@lastDay=year(@DatumSaTackama);选择DATEADD(年份,DATEDIFF(年份,-1,@lastDay)-1,-1);现在,我如何将它传递给@Sql语句?@T_Dejan我已经包含了一个动态Sql示例