我使用查询,我根据where条件从表中选择一些属性。我的条件是 -
date>GetDate();
我试过这个 -
SELECT TOP 2 img,name,substring(description,1,80) as
description,Convert(nvarchar,date,106) as date
FROM tbl_test
where date>=Convert(nvarchar,GetDate(),106)
order by date Asc;
此查询运行正常,但与我不转换日期格式的类似类型的其他查询相比,显示的结果不同。
SELECT TOP 2 img,name,substring(description,1,80) as description,date
FROM tbl_test
where date>=GetDate()
order by date Asc;
请指导我在哪里做错了?
答案 0 :(得分:1)
您的第一个查询会将getdate()转换为nvarchar数据类型,它会将日期与字符串进行比较,而第二个查询将比较2个日期。 所以第二个选项更好。如果您想将日期转换为字符串,请检查然后使用102格式,如
WHERE CONVERT(varchar(20),date,102) >= CONVERT(varchar(20), getdate(),102)
对于选择列,您可以使用您想要的格式
SELECT CONVERT(varchar(20),date,106)
最终查询是:
SELECT TOP 2
img,
name,
SUBSTRING(description,1,80) as description,
CONVERT(varchar(20),date,106) as [DisplayDate]
FROM tbl_test
WHERE CONVERT(varchar(20),date,102) >= CONVERT(varchar(20), getdate(),102)
ORDER BY date ASC;
如果没有转换为varchar,您可以将getdate()转换为日期以删除时间部分:
SELECT TOP 2
img,
name,
SUBSTRING(description,1,80) as description,
CONVERT(varchar(20),date,106) as [DisplayDate]
FROM tbl_test
WHERE date >= CAST(getdate() as date)
ORDER BY date ASC;
<强> SQL Fiddle Demo 强>
答案 1 :(得分:1)
DECLARE @Date Datetime;
SET @Date = GETDATE();
SELECT CONVERT(VARCHAR(12), @Date, 113) AS Date
<强> RESULT 强>
╔══════════════╗
║ Date ║
╠══════════════╣
║ 01 Jan 2014 ║
╚══════════════╝
修改强>
正如Upendra Chaudhari所解释的那样,当您将列Date
与字符串=Convert(varchar(20),GetDate(),102)
进行比较时,
幕后实际发生的是Convert(varchar(20),GetDate(),102)
返回字符串2014.01.01
但是为了将此字符串与Datetime列进行比较,SQL Server执行隐式转换以比较两个值。 Sql Server必须具有相同数据类型的两个值才能进行比较。
现在数据类型Datetime优先于nvarchar / varchar数据类型,因此sql server将字符串转换为datetime数据类型,返回类似
的内容SELECT CAST('2014.01.01' AS DATETIME)
Result : 2014-01-01 00:00:00.000
现在,在将您的值转换为字符串然后再转换回日期时间的过程中,您实际上已经丢失了比较值中的所有时间值。这就是你得到意想不到的结果的原因。
因此,请确保无论何时进行比较,双方都拥有完全相同的数据类型,并控制代码中的任何数据转换,而不是sql server为您执行数据类型转换。
我希望这能解释你为什么会得到不同的结果。
答案 2 :(得分:0)
您可以尝试:
where date>=CONVERT(VARCHAR(11), GETDATE(), 113)