2013-07-21 76 views
0

我有payment表和列的一个是p_craetedatep_createdate类型为DateTime如何选择从表,其中日期时间=日期

CREATE TABLE [dbo].[tbl_Payments](
    [p_id] [bigint] IDENTITY(100000,1) NOT NULL, 
    [p_amount] [int] NOT NULL, 
    [p_status] [tinyint] NOT NULL, 
    [p_createdate] [datetime] NOT NULL, 
    [p_creditor] [int] NOT NULL, 
    [p_debtor] [int] NOT NULL, 
    [p_type] [int] NOT NULL, 
CONSTRAINT [PK_tbl_Payments] PRIMARY KEY CLUSTERED) 

我想获得,在“2013年7月16日”

+1

SQL Server的版本? –

+0

sql server 2008 r2 –

回答

3

使用DATE数据类型目前在SQL Server 2008 更新:

SELECT (list of columns) 
FROM dbo.tbl_Payments 
WHERE CAST(p_createddate AS DATE) = '20130716' 

DATE数据类型只包含日期 - 没有时间部分 - 因此比较20130716在ISO-8601格式(适用于任何语言/你的SQL Server的区域设置),会给你在那里创建的所有行2013年7月16日 - 无论什么时间。

+1

即使作为'DATE'强制转换为sargable,我仍然更喜欢范围寻找作为[更好的基数估计](http://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-butis - 它-A-好主意) –

0
创建的行
SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue >= DATEADD(dd, DATEDIFF(dd,0,'2013-07-16 00:00'), 0) 
AND dateValue < DATEADD(dd, DATEDIFF(dd,0,'2013-07-17 00:00'), 1) 
+3

'BETWEEN'不正确。它需要''=和<' –

+0

@MartinSmith修复 –

+0

另外'选择DATEADD(dd,DATEDIFF(dd,0,'2013-07-17 00:00'),1)'是第18位。我不明白你为什么在这里使用'DATEADD'。就像在哈姆雷特的答案中的字面常量将工作得很好。 –

1

您可以使用某些先前答案的查询,但先阅读sargable

SELECT * FROM tbl_Payments 
WHERE p_createdate >= '20130716' 
    AND p_createdate < '20130717' 
相关问题