SQL Server中的dd/MM/yyyy

SQL Server中的dd/MM/yyyy,sql,sql-server,sql-server-2005,types,Sql,Sql Server,Sql Server 2005,Types,我有一个DATETIME列EntryDate,并将值存储为dd/MM/yyyy格式。 但是,当我通过SQL获取记录时,并没有得到预期的结果 例如: 从2009年10月23日到2009年11月23日,我有90条记录。我只有5到10张唱片。为什么会这样 我的问题是: SET DATEFORMAT DMY; SELECT * FROM salesorderlist so LEFT JOINT sites s ON s.id = so.siteid WHERE so.entrydate between

我有一个DATETIME列EntryDate,并将值存储为dd/MM/yyyy格式。 但是,当我通过SQL获取记录时,并没有得到预期的结果

例如:

从2009年10月23日到2009年11月23日,我有90条记录。我只有5到10张唱片。为什么会这样

我的问题是:

SET DATEFORMAT DMY;
SELECT * FROM salesorderlist so 
LEFT JOINT sites s ON s.id = so.siteid
WHERE so.entrydate between '23/10/2009' and '23/11/2009' 
ORDER BY so.entryDate DESC
但是,当我给出日期范围从2009年10月23日到2009年10月31日时,我得到了正确的结果,如果我给出日期范围从2009年10月23日到2009年11月1日,我甚至没有得到一行

我错过了什么

在数据库中,我将值存储为31/10/2009 dd/MM/yyyy格式

提前谢谢

我犯了一个错误。。 Entrydate是Varchar列。现在改为Datetime。谢谢你们的帮助

我现在有一个更大的问题…如何将varchar列转换为datetime列…如何更新表

当我尝试更改数据类型时,会出现以下错误: 将char数据类型转换为datetime数据类型导致datetime值超出范围。 声明已终止

我不想删除记录,因为有数千条记录。有没有转换的方法?
谢谢

看起来您是在以文本格式存储日期,在这种情况下,返回的结果集是正确的,因为如果您对相同长度的字符串进行字母数字排序,2009年11月23日几乎是在2009年10月23日之后


除非您有充分的理由不这样做,否则您应该始终将日期存储为日期,将数字存储为数字等。

我猜您将数据存储为varchar

在字符串比较中,“23/10/2009”和“23/11/2009”与第5个字符相同

你应该

使用yyyymmdd表示日期文字,yyyy mm dd表示新的SQL 2008日期文字 使用日期+时间数据类型之一
仅供参考:假设该列实际上是DateTime类型,其他人建议您使用的可能是文本列,则不以X格式存储日期值;日期值使用内部格式存储在数据库中。日期格式仅在检索数据时起作用

话虽如此,你的约会中有时间价值吗?如果您的日期对应于2009年11月23日,但时间值不同于0:00:00,则这些日期将不会显示在您的查询中。您应该指定类似于“23/11/2009 23:59:59.999”的内容


无论如何,像这样构造查询通常不是一个好主意,在查询本身中硬编码where子句的参数。这很容易出错,您可能会无意中打开依赖注入攻击的大门。相反,如果您使用ADO.NET,您应该使用正在使用的数据库访问引擎的参数机制,例如,请参见此处:

,除非您给出一个时间,它将在一天开始时使用12:00 AM,因此日期<23/11/2009将不包括23日的任何条目。这有用吗

也许您的联接没有生成您认为是的内容-请在按日期限制它之前查看中间表


如果您发布表中的数据,我可以尝试提供更多帮助。

如果您将日期存储为日期时间数据类型,则我将尝试使用ISO-8601日期格式YYYYMMDD进行任何查询:

SELECT ......
WHERE so.entrydate BETWEEN '20091023' and '20091123' 
此格式独立于任何日期格式设置,并且始终有效-无论SQL Server计算机上的日期格式如何

另外,您需要记住DATETIME也存储时间-因此上面的查询只会返回2009年11月23日0:00之前的记录-在这一天不会显示任何内容

如果要在2009年11月23日之前(包括2009年11月23日)进行中间查询,则需要指定:

SELECT ......
WHERE so.entrydate BETWEEN '20091023' and '20091123 23:59:59' 
或者只是用“20091124”作为你的第二个标准——然后你就可以在11月23日前一天的最后一秒钟内完成所有事情

如果您使用的是SQL Server 2008,您还可以查看新的日期数据类型,它只存储日期,而不存储时间,从而使此类查询变得更加简单!而且占用的空间也比较少

更新:

要转换现有表,我将执行以下操作:

创建DATETIME类型的新列MyNewDateTime 在表上运行脚本以转换所有字段:

UPDATE dbo.salesorderlist 
SET MyNewDateTime = CONVERT(DATETIME, EntryDate, 103)
这应该将dd/mm/yyyy样式的日期字符串转换为DATETIME,并将其存储在新列中。完成后,可以删除旧列

ALTER TABLE dbo.salesorderlist DROP COLUMN EntryDate
如果要执行以下操作,请将新名称重命名为旧名称:

EXEC sys.sp_rename @objname = 'dbo.salesorderlist.MyNewDateTime', 
                   @newname = 'EntryDate', 
                   @objtype = 'COLUMN'

Marc要转换列数据类型,我通常执行以下操作

ALTER TABLE salesorderlist ADD entrydate2 datetime
GO
UPDATE salesorderlist SET entrydate2=CAST(entrydate AS datetime)
GO
ALTER TABLE salesorderlist DROP COLUMN entrydate
GO
EXEC sp_rename 'dbo.salesorderlist.entrydate2', 'entrydate', 'COLUMN'
GO

为了转换您的列,我建议您首先将列的内容更改为使用明确的格式yyyymmdd或yyyy mm ddThh:mm:ss,具有明显的含义,但T只是字面上的字母T,然后执行alter table语句。

使用此->

SET DATEFORMAT DMY;SELECT * FROM salesorderlist so LEFT JOINT sites s ON s.id = so.siteidWHERE so.entrydate between convert(varchar, '23/10/2009',101) and convert(varchar, '23/11/2009', 101) ORDER BY so.entryDate DESC

数据库中的so.entrydate是什么类型的?非常感谢。现在请帮助我完成转换AM无法转换为varchar to datetime列。您知道转换的方法吗?问题
on明确表示数据存储为DATETIME而不是varchar?@Mitch:检查问题更新时间与先前答案的时间。