【问题标题】:Nvarchar to Date迄今为止的 Nvarchar
【发布时间】:2017-08-14 10:11:00
【问题描述】:

在我的桌子上

ReportingWeek (Date)         eg 2017-03-19
BookedWeek (nvarchar(12)     eg 07.2017 

我想选择过去 17 周内BookedWeek 所在的行。

是否需要将BookedWeek 转换为date,然后查询过去17 周,还是可以直接作为nvarchar 完成?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 您使用的是哪个 dbms? (在日期/时间方面,许多产品远不符合 ANSI SQL。)

标签: sql date type-conversion date-conversion nvarchar


【解决方案1】:

您不需要将值转换为日期。如果你想把它当作约会,那是合理的。如果您想将其与“真实世界”日期进行比较,这一点尤其重要。

我应该注意,如果您要将值存储为字符串,则应将其存储为 YYYYWW 格式(YYYY.WW 很好)。这样,可以对值进行排序并相互比较。

【讨论】:

    【解决方案2】:

    是的,你必须先将字符串转换为日期时间,看这个例子:

    SELECT * WHERE DATEDIFF(DAY,cast('2017-03-19' AS datetime),GETDATE())<17
    

    【讨论】:

      【解决方案3】:

      无需将预订周转换为日期。我们可以通过字符串函数来处理。下面的查询应该给你预期的结果,考虑到全年。

      create table #tmp
      (
      bookedweek nvarchar(12)
      )
      insert into #tmp values ('07.2017'),('09-2017'),('01.2017'),('50.2016'),('52.2016'),('13.2016'),('48.2016'),('49.2016')
      select * from #tmp
      where (year(getdate())=RIGHT(bookedweek,4) and datepart(week,getdate())- LEFT(bookedweek,2)<17)
            OR (year(getdate()) - RIGHT(bookedweek,4)=1 and 53 - LEFT(bookedweek,2) + datepart(week,getdate()) < 17)
      drop table #tmp
      

      这里 53 是一个日历年的总周数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多