当日期存储为nvarchar时,选择日期范围之间的所有数据的SQL

当日期存储为nvarchar时,选择日期范围之间的所有数据的SQL,sql,sql-server,vba,sql-server-2008,date,Sql,Sql Server,Vba,Sql Server 2008,Date,我继承了一个T-SQL表,其中的Start\u Date和End\u Date列是nvarchar数据类型。我需要选择某一天的所有记录,这些记录的开始日期在该日期之前,但结束日期在该日期之后 另一个问题是,有些人仍然是最新的,没有结束日期。遗憾的是,我不能将列的数据类型转换为日期。我试图用VBA写这个,因为 我的老板懂Excel,而且 他正在做的报告必须以Excel格式发送 例如: Name Start_Date End_Date Joe 12/1/2014 6/15

我继承了一个T-SQL表,其中的
Start\u Date
End\u Date
列是
nvarchar
数据类型。我需要选择某一天的所有记录,这些记录的开始日期在该日期之前,但结束日期在该日期之后

另一个问题是,有些人仍然是最新的,没有结束日期。遗憾的是,我不能将列的数据类型转换为日期。我试图用VBA写这个,因为

  • 我的老板懂Excel,而且
  • 他正在做的报告必须以Excel格式发送
  • 例如:

    Name    Start_Date    End_Date
    Joe     12/1/2014     6/15/2016
    Bob     8/28/2013     6/5/2014
    Jon     1/27/2015     12/18/2015
    Tim     8/28/2013     
    
    如果我选择的日期是2015年8月15日,我返回的数据应该是

    Name    Start_Date    End_Date
    Joe     12/1/2014     6/15/2016
    Jon     1/27/2015     12/18/2015
    Tim     8/28/2013     
    
    我尝试了以下查询,但它们返回
    运行时错误-2147217900(80040e14)自动化错误

    SELECT NAME 
    FROM INFORMATION 
    WHERE CONVERT(datetime, START_DATE, 101) >= '12/1/2015' 
      AND CONVERT(datetime, END_DATE, 101) <= '12/31/2015'
    
    SELECT NAME 
    FROM INFORMATION 
    WHERE START_DATE >= '12/1/2015'
    
    有单引号和无单引号时,SSMS的实际SQL错误为:

    Msg 241, Level 16, State 1, Line 4
    Conversion failed when converting date and/or time from character string.
    

    看看表中的数据,我可以看到一些日期是空的,一些是空的,还有一些是mm/dd/yy(甚至是m/d/yy)。我想让SQL来完成所有繁重的工作,但现在我正试图确定是否更难
    选择*
    并在Excel中处理它,或者让我的老板、他的同事和我的老上司来“修复”表格。

    你需要切换>=和你需要切换>=并抓住
    =
    这是一个VBA错误,不幸的是,我对VBA一无所知。您有权直接查询SQL吗?我建议您通过SQL Management Studio确认查询是否有效,然后更改VBA代码以执行一些简单的操作,例如从信息中选择前10名,我猜您将得到相同的错误,因为它可能与任何特定的SQL查询无关。如果我的数据更干净,您的查询将非常棒。你们知道我怎么处理日期的变化吗?哎呀。是的,理想情况下,您可以修复数据。一种简单的方法是以正确的格式将其复制到新表中,然后从新表中进行选择。你还是保留那张旧桌子,以防出差错。另一个选项是表上的视图,在视图中,您使用一组case语句固定日期(基本上,如果是mm/dd/yyyy,则使用101进行转换,如果mm/dd/yy使用1,等等)。看见通过这种方式,VBA查询很简单,视图是一次性的复杂项。有趣的花絮:其中一个日期是9/2/605(我确定它应该是9/2/05或可能是06)。VBA认为这是一个有效的日期,可以很好地使用它。但是,如果您试图将该值插入格式为日期的单元格,Excel将崩溃。这是一个VBA错误,很好地抓住了
    =
    这是一个VBA错误,不幸的是,我对VBA一无所知。您有权直接查询SQL吗?我建议您通过SQL Management Studio确认查询是否有效,然后更改VBA代码以执行一些简单的操作,例如从信息中选择前10名,我猜您将得到相同的错误,因为它可能与任何特定的SQL查询无关。如果我的数据更干净,您的查询将非常棒。你们知道我怎么处理日期的变化吗?哎呀。是的,理想情况下,您可以修复数据。一种简单的方法是以正确的格式将其复制到新表中,然后从新表中进行选择。你还是保留那张旧桌子,以防出差错。另一个选项是表上的视图,在视图中,您使用一组case语句固定日期(基本上,如果是mm/dd/yyyy,则使用101进行转换,如果mm/dd/yy使用1,等等)。看见通过这种方式,VBA查询很简单,视图是一次性的复杂项。有趣的花絮:其中一个日期是9/2/605(我确定它应该是9/2/05或可能是06)。VBA认为这是一个有效的日期,可以很好地使用它。然而,如果您试图将该值插入格式为日期的单元格,Excel将崩溃。在VBA SQL构造字符串中,您可能需要在日期文字周围添加单引号字符,并可能对日期值使用format函数,以确保VBA日期正确格式为“mm/dd/yyyy”字符串。在VBA SQL中构造字符串您可能需要在日期文字周围添加单引号字符,或者对日期值使用format函数,以确保VBA日期正确格式化为“mm/dd/yyyy”字符串。
    
    SQL = "SELECT EMPLOYEE_NAME FROM dbo.INFORMATION " & _
          "WHERE CONVERT(DATETIME, START_DATE, 101) <= 12/01/2016 " & _
          "AND CASE END_DATE " & _
          "WHEN '' THEN GETDATE() " & _
          "ELSE CONVERT(DATETIME, END_DATE, 101) " & _
          "END >= 12/31/2016"
    
    Msg 241, Level 16, State 1, Line 4
    Conversion failed when converting date and/or time from character string.
    
    SELECT  Name
    FROM    dbo.INFORMATION
    WHERE   CONVERT(DATETIME, Start_Date, 101) <= @targetdate
            AND CONVERT(DATETIME, End_Date, 101) >= @targetdate
    
    SELECT  Name
    FROM    dbo.INFORMATION
    WHERE   CONVERT(DATETIME, Start_Date, 101) <= @targetdate
                        AND     CASE End_Date
                                  WHEN '' THEN GETDATE()
                                  ELSE CONVERT(DATETIME, End_Date, 101)
                                END >= @targetdate
    
    SELECT  Name
    FROM    dbo.INFORMATION
    WHERE   @targetdate BETWEEN CONVERT(DATETIME, Start_Date, 101)
                        AND     CASE End_Date
                                  WHEN '' THEN GETDATE()
                                  ELSE CONVERT(DATETIME, End_Date, 101)
                                END