2013-05-06 131 views
0

我写了这个查询:如何使用WHERE子句与日期时间在SQL Server 2008

SELECT * 
FROM w_tbl 
WHERE DID NOT IN (SELECT DId FROM tbl_Assign) 
    AND CAST(MeasDateTime AS Date) = @dta 
ORDER BY 
    CAST(MeasDateTime as DATE) DESC 

因此,大家可以看到我送一个参数化查询。

所以我把24/09/2010 00:00:00@dta

但我得到这个错误:

Conversion failed when converting date and/or time from charterer string.

我告诉你为什么我这样做,我的目的:

我有一个日期时间列,并我想按日期选择/获取所有数据(即我不想取得日期时间明智的,它必须只是根据日期)

+0

你的意思是你将'@ dta'的值设置为*字符串*?为什么不把它设置为'DateTime'呢? – 2013-05-06 06:41:01

+0

我会怀疑MeasDateTime可能没有有效的值。顺便提一下,这个专栏的类型是什么? – 2013-05-06 06:44:30

+0

@JonSkeet我在DB领域也是日期时间,它不是字符串.... – 2013-05-06 06:44:57

回答

0

如果你想仅按照日期来选择,你有DateTime类型,使用日期函数:

你的情况
DATEADD (dd , 0 , DATEDIFF (dd , 0 , @dta)) 

所以:

SELECT * 
FROM w_tbl 
WHERE DID NOT IN (SELECT DId FROM tbl_Assign) 
    AND DATEADD (dd , 0 , DATEDIFF (dd , 0 , MeasDateTime)) = DATEADD (dd , 0 , DATEDIFF (dd , 0 , @dta)) 
ORDER BY 
    MeasDateTime DESC -- No need for CAST/CONVERT here, it will be ok either way 
-1

首先检查@dta值的原因24/09/2010可能是错误的日期。尝试使用2010年9月24日或2010年9月24日并检查。总是以avoid confusion in dd/MM/yyyy and MM/dd/yyyy月份使用MMM。 SQL使用MMM正确处理日期时间格式。像dd-MMM-yyyy一样。默认情况下,SQL使用美国标准,取日期格式为MM/dd/yyyy。

谢谢。

+0

SQL Server一致解释的唯一格式是'YYYYMMDD';这是[记录](http://msdn.microsoft.com/en-us/library/ms187819.aspx)和日期文字使用其他格式迟早会由于语言环境设置而中断。 – Pondlife 2013-05-06 14:47:45

+0

@Pondlife。感谢您使用文档进行更新。但是对于上述问题,Jitendra对dd/MM/yyyy和MM/dd/yyyy日期格式感到困惑,这是他的实际问题,我想在使用区域设置格式进行投射或转换时突出Jitendra和其他人。 – 2013-05-07 09:04:27