如何转换2014年1月1日格式的GetDate()?

时间:2014-01-01 11:28:54

标签: sql

我使用查询,我根据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;

请指导我在哪里做错了?

3 个答案:

答案 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)