【问题标题】:dd/MM/yyyy in SQL ServerSQL Server 中的 dd/MM/yyyy
【发布时间】:2010-12-19 09:49:04
【问题描述】:

我有一个 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

但是当我给出从 23/10/2009 到 31/10/2009 的日期范围时,我得到了正确的结果,如果我给出的日期范围从 23/10/2009 到 01/11/2009 我没有得到甚至是一行。

我错过了什么?

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

提前致谢。

做错了..
Entrydate 是 Varchar 列。现在将其更改为日期时间。谢谢大家的帮助

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

当我尝试更改数据类型时,我收到错误: 将 char 数据类型转换为 datetime 数据类型会导致 datetime 值超出范围。 该语句已终止。

我不想删除记录,因为有成千上万的记录。有什么方法可以转换吗? 谢谢

【问题讨论】:

  • so.entrydate在数据库中是什么类型?

标签: sql sql-server sql-server-2005 types


【解决方案1】:

您似乎是以文本格式存储日期,在这种情况下,返回的结果集是正确的(因为如果您对相同长度的字符串进行排序,则 23/11/2009 几乎直接在 23/10/2009 之后字母数字)。

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

【讨论】:

    【解决方案2】:

    我猜你将数据存储为 varchar。

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

    你应该

    • 使用 yyyymmdd 表示日期文字(yyyy-mm-dd 表示新的 SQL 2008 版本)
    • 使用日期+时间数据类型之一

    【讨论】:

    • 无法将 varchar 转换为 datetime 列。您知道任何转换方法吗?
    • 问题明确指出数据存储为 DATETIME 而不是 varchar()?
    • @Mitch:检查问题更新时间与较早答案的时间。
    【解决方案3】:

    仅供参考:假设该列实际上是 DateTime 类型(其他人建议您可能正在使用文本列),您不会“以 X 格式存储日期值";日期值使用内部格式存储在数据库中。日期格式仅在检索数据时播放。

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

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

    【讨论】:

      【解决方案4】:

      除非您指定时间,否则它将在一天开始时使用 12:00 AM,因此“日期

      也许您的联接没有生成您认为的那样 - 在按日期限制之前尝试查看中间表。

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

      【讨论】:

        【解决方案5】:

        如果您将日期存储为 DATETIME 数据类型,那么我会尝试使用 ISO-8601 日期格式 (YYYYMMDD) 进行任何查询:

        SELECT ......
        WHERE so.entrydate BETWEEN '20091023' and '20091123' 
        

        此格式独立于任何日期格式设置,并且始终有效 - 无论您的 SQL Server 计算机上的日期格式如何。

        另外,您需要记住 DATETIME 还存储 TIME - 所以上面的查询将只返回那些在 2009 年 11 月 23 日仅 0:00 小时内的记录 - 它会不会在那一天显示任何东西!

        如果您想要一个 BETWEEN 查询直到 2009 年 11 月 23 日(包括所有),您需要指定:

        SELECT ......
        WHERE so.entrydate BETWEEN '20091023' and '20091123 23:59:59' 
        

        或仅使用“20091124”作为您的第二个标准 - 然后您将完成所有内容,包括前一天(11 月 23 日)的最后一秒。

        如果您使用的是 SQL Server 2008,您还可以查看新的 DATE 数据类型,它只存储日期 - 没有时间 - 并使此类查询变得更加容易! (此外还占用更少的空间)。

        更新:

        要转换您现有的表格,我会这样做:

        • 创建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'
        

        马克

        【讨论】:

        • 非常感谢。现在请帮助我完成转换
        【解决方案6】:

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

        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
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            使用这个 -->

            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
            

            【讨论】:

              猜你喜欢
              • 2020-02-24
              • 1970-01-01
              • 1970-01-01
              • 2017-10-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-19
              • 2018-10-28
              相关资源
              最近更新 更多