【问题标题】:How to cast and convert to datetime in where condition in t-sql?如何在 t-sql 中的 where 条件下转换并转换为日期时间?
【发布时间】:2021-04-16 09:14:21
【问题描述】:

我正在尝试从 vis_p_activities_final 表中获取最近几个月的数据,并尝试了以下查询:

SELECT * FROM DPICD.vis_p_activities_final 
WHERE  DPICD.vis_p_activities_final.current_activity_code IN ( 
              'SDBPR', 'SDBPU', 'XSDBPU', 'SDBPUX' ) 
       AND CAST((DPICD.vis_p_activities_final.raised_date_time) AS DATETIME) >= 
           Dateadd(month, -1, CURRENT_TIMESTAMP)`

raised_date_time 列是 VARCHAR,我想将其转换为过滤器的日期时间。我该怎么做?

【问题讨论】:

  • 为什么DPICD.vis_p_activities_final.raised_date_time1 还不是日期时间?此外,3+ part naming for columns is to be deprecated 在 SQL Server 中;给你的对象起别名并用它来限定你的列。
  • 因为输出视图要求 raise_date_time 为 varchar
  • 这本身就是一个设计缺陷。很明显,该语句自相矛盾,因为如果它“需要”成为varchar,那么您不应该尝试在 SQL 中将其视为datetime。根据定义,varchar不是datetime。问题是你的设计;解决这个问题,问题就会消失。
  • @Mazil_tov998 什么输出视图?您确定有任何此类要求还是客户端代码应该简单地更改显示格式?将日期存储为字符串是你能做的最糟糕的事情
  • 请阅读this,了解一些改进问题的技巧。 DDL 和示例数据将帮助我们帮助您。也许indexed computed column 会提供更好的性能。而“最后几个月”[sic] 有点模糊。

标签: sql tsql datetime casting type-conversion


【解决方案1】:

你可以使用临时表

declare @lastmonth datetime
   set @lastmonth = Dateadd(month, -1, CURRENT_TIMESTAMP)`

   SELECT *, CAST((DPICD.vis_p_activities_final.raised_date_time) AS DATETIME) as 
   'revised_date' into #tmp FROM DPICD.vis_p_activities_final 
   WHERE  DPICD.vis_p_activities_final.current_activity_code IN ( 
              'SDBPR', 'SDBPU', 'XSDBPU', 'SDBPUX' ) 
       `

   select * from #tmp where revised_date >= @lastmonth

【讨论】:

  • 这里为什么需要临时表或变量?这并不能回答问题
  • 过滤掉所需的日期,因为他的表结构不允许直接过滤器获取上个月的数据。
  • 所以要么使用子查询,要么使用CROSS APPLY 来存储转换后的值。临时表或变量都不需要,它们都可能导致严重的性能问题
  • 这是有道理的,但是为了便于理解数据,临时表结果会有所帮助。
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多