在SQL Server中将datetime转换为字符串/varchar
我在SQLServer中有一个视图,它使用日期来确定从哪些表访问数据。问题是,它似乎只有在将日期指定为在SQL Server中将datetime转换为字符串/varchar,sql,sql-server,date,Sql,Sql Server,Date,我在SQLServer中有一个视图,它使用日期来确定从哪些表访问数据。问题是,它似乎只有在将日期指定为varchar时才起作用,就像'20120423'一样 因此,我尝试使用GETDATE()动态创建此日期,而不必使用键入的版本。当我运行topSELECT语句时,它会像我预期的那样返回'20120423',但当我尝试比较这两个值时,它们不相等,并且IF语句会打印“值不相同” SELECT '''' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()
varchar
时才起作用,就像'20120423'
一样
因此,我尝试使用GETDATE()
动态创建此日期,而不必使用键入的版本。当我运行topSELECT
语句时,它会像我预期的那样返回'20120423'
,但当我尝试比较这两个值时,它们不相等,并且IF
语句会打印“值不相同”
SELECT
'''' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +''''
IF '''' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +'''' = '20120423'
BEGIN
PRINT 'VALUES ARE THE SAME'
END
ELSE
BEGIN
PRINT 'VALUES ARE NOT THE SAME'
END
我有点不知所措,不知该从这里走到哪里。谢谢你的帮助
编辑:根据给出的答案,这两个问题应该是相同的,尽管我认为它们的处理方式不同
SELECT *
FROM DatesView
WHERE Timestamp > CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112)
SELECT *
FROM DatesView
WHERE Timestamp > '20120423'
顶部搜索所有表格,底部搜索只正确搜索必要的表格。删除前两个
“
。试试这个。
您正在比较'20120423'=20120423
SELECT '' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +''
IF '' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +'' = '20120423'
BEGIN
PRINT 'VALUES ARE THE SAME'
END
ELSE
BEGIN
PRINT 'VALUES ARE NOT THE SAME'
END
删除前两个
”
。试试这个。
您正在比较'20120423'=20120423
SELECT '' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +''
IF '' +CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) +'' = '20120423'
BEGIN
PRINT 'VALUES ARE THE SAME'
END
ELSE
BEGIN
PRINT 'VALUES ARE NOT THE SAME'
END
您正在向字符串添加撇号,因此您的比较实际上是(用括号替换字符串分隔符): 我想你想要:
IF CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) = '20120423'
和/或
SELECT CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112)
您正在向字符串添加撇号,因此您的比较实际上是(用括号替换字符串分隔符): 我想你想要:
IF CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) = '20120423'
和/或
SELECT CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112)
你会被引号给甩了,把它们去掉吧,它们是不必要的
SELECT CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112)
IF CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) = '20120423'
BEGIN
PRINT 'VALUES ARE THE SAME'
END
ELSE
BEGIN
PRINT 'VALUES ARE NOT THE SAME'
END
你会被引号给甩了,把它们去掉吧,它们是不必要的
SELECT CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112)
IF CONVERT(VARCHAR(8), DateAdd(YY,-2,GETDATE()), 112) = '20120423'
BEGIN
PRINT 'VALUES ARE THE SAME'
END
ELSE
BEGIN
PRINT 'VALUES ARE NOT THE SAME'
END
出于好奇,您是否尝试选择了
'''+-CONVERT(VARCHAR(8),DateAdd(YY,-2,GETDATE()),112)+''''
,以查看它实际上代表了什么?与您的问题无关,但您文章的第一句话表明您的数据库设计可能是次优的。因此,忽略数据库设计,我的编辑中的两个查询是否应该被视为相同的?只是出于好奇,您是否尝试选择了''''CONVERT(VARCHAR(8),DateAdd(YY,-2,GETDATE()),112)+''以查看它实际代表的内容?与您的问题无关,但是你文章的第一句话表明你的数据库设计可能是次优的。因此,如果不考虑数据库设计,我的编辑中的两个查询是否应该被视为相同的?令我惊讶的是,如果CONVERT(VARCHAR(8),DateAdd(YY,-2,GETDATE()),112)=20120423 ie没有撇号,这同样有效。我想这是一个恰好看起来像数字的varchar。@JohnBarça之所以有效,是因为SQL会隐式地将字符串转换为一个数字,以便将其与数字进行比较。因此,在我编辑之后,这两个查询“应该”被正确地对待吗?令我惊讶的是,如果转换(varchar(8),DateAdd(YY,-2,GETDATE()),112),这同样有效=20120423,即不带撇号。我想这是一个恰好看起来像数字的varchar。@JohnBarça之所以有效,是因为SQL会隐式地将字符串转换为数字,以便将其与数字进行比较。所以在我编辑之后,这两个查询“应该”被视为相同的,对吗?