【问题标题】:How to compare two date in SQL Server 2005?如何比较 SQL Server 2005 中的两个日期?
【发布时间】:2015-08-28 23:50:42
【问题描述】:

如何在 SQL 中将日期值转换为dd-MM-yyyy 的格式?我已将日期以varchar(10) 格式存储到数据库中。现在想比较从1-05-201531-06-2015 的日期。

查询是:

select date
from dates
where date >='1-05-2015' and date <='10-06-2015'

我需要水晶报表方面的帮助。 水晶报表2008怎么去掉空行?

它只返回(使用between的结果相同)

  1. 1-06-2015
  2. 10-06-2015
  3. 1-07-2015

我不能使用 Format Method 因为 2005 不支持。我尝试了 Convert 方法但没有帮助。

【问题讨论】:

  • 为什么首先将日期存储为字符串?

标签: sql sql-server tsql datetime sql-server-2005


【解决方案1】:

您可以转换为带样式的日期类型:

select date 
from dates
where convert(date, date, 103) between '20150501' and '20150610' 

永远不要将日期保存为字符串,将数字保存为字符串等。使用适当的类型,这将使​​您远离此类问题。

【讨论】:

    【解决方案2】:

    幸运的是,我在我的机器上安装了 2005,我得到了结果。

    看到这个SQL Fiddle

    如果这对您没有帮助,请告诉我。

    【讨论】:

      【解决方案3】:

      我可以使用以下代码将 varchar 转换为 sql 2014 中的日期时间

      ALTER TABLE table_you_want ALTER COLUMN column_you_want DATETIME

      嗯,我不确定 2005 是否支持它。 希望对您有所帮助..!!1

      【讨论】:

        【解决方案4】:

        我同意其他 cmets 以正确的日期格式存储日期是最好的方法,但有时更改数据库是不可行的。

        这里有一些将日期从字符串格式转换为日期时间的代码,假设月份和年份始终为 2 和 4 个字符,而日期是唯一的可变长度。

        注意,我将 where 语句中的日期从“1-05-2015”更改为“2015-05-01”,将“10-06-2015”更改为“2015-06-10”。

        select date
               , cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime) as converted_date
        from dates
        where
             cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime)
                 >= cast('2015-05-01' as datetime)
             and cast(right(date, 4)+'-'+SUBSTRING(date, charindex('-', date)+1, 2)+'-'+left(date, charindex('-', date)-1) as datetime)
                 <= cast('2015-06-10' as datetime)
        

        【讨论】:

        • 感谢您的回复。但是通过数据库文件的一些变化来解决它。我将数据类型 varchar(30) 更改为日期时间。问题解决了。它将更改所有源代码。我会试试你的代码谢​​谢。再见
        • 当我尝试它时给我一个错误“--- char 数据类型到 datetime 数据类型的转换导致 datetime 值超出范围。--”
        • 可能是某天或某月解析不正确。您可以删除演员表并将年月日分成列,然后检查数据以确保其正确。像这样:select right(date, 4) as split_year, SUBSTRING(date, charindex('-', date)+1, 2) as split_month, left(date, charindex('-', date)-1) as split_day从日期
        【解决方案5】:

        不记得CONVERT是否和现在一模一样,但你可以试试

        SET DATEFORMAT dmy -- Needed if date format on database server is different so the start and end date string values 01-05-2015 and 10-06-2015 can be converted automatically with the custom format
        select date from dates where CONVERT(Date, date, 105) >='01-05-2015' and CONVERT(Date, date, 105) <='10-06-2015'
        

        我建议不要将日期存储为 varchar(10),而是存储为 Date 或 DateTime。 此外,我将使用 yyyy-MM-dd 格式,无论设置如何都可以解释,因此您不需要 SET DATEFORMAT。 因此,如果您始终将日期存储为日期,您可以执行以下操作(以及其他功能):

        select date from dates where date >= '2015-05-01' and date <= '2015-06-10'
        

        【讨论】:

        • 你说的很对。顺便说一句,看看他如何存储日组件:它是 1 位或 2 位数字。这不适用于 convert 语句。您需要先清理这些日子。
        • 我无法想象这是一个要求,因为天是 1 位数,月份是 2 位数。你使用 nvarchar(10) 不是因为你不知道使用 date 有多容易,并认为 nvarchar(10) 更容易吗?您可以看到将日期设置为 '2015-06-10' 时,如果 SQL Server 知道它需要一个日期,它会自动将其转换为日期。
        • 如果您确实需要将日期存储为 varchar(10),则始终将其设为 10 长,因此将日期设为 2 位数。也将日期另存为 yyyy-MM-dd,这样您就可以同时使用 CAST 作为 CONVERT 来制作日期,这样您就可以轻松应用所有日期函数/比较。
        • 给出错误将 char 数据类型转换为 datetime 数据类型导致 datetime 值超出范围。
        【解决方案6】:

        如果您将日期存储为字符串,您应该使用它来将其转换为 DATE

        https://msdn.microsoft.com/de-de/library/ms187928.aspx

        【讨论】:

        • 然后他要检查这个字符串是10个字符还是9个......如果是9,那么在开头加0。
        • 它需要转换为 DATETIME,我认为 SQL 2005 没有 DATE 数据类型。
        猜你喜欢
        • 2010-12-04
        • 2012-03-20
        • 2020-07-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多