SQL Server中仅日期的时间范围

问题描述 投票:1回答:3

我有一个名为Transactions的表,它包含这样的数据:

transaction_id   cust_id   tran_date  
 80712190438     270351     28-02-14
 29258453508     270384     27-02-14
 58387181112     275068     31-12-13
 21300411973     274568     31-12-13
 26229626485     267624     31-12-12
 26229126485     267634     31-12-12
 47557596721     273764     31-12-11
 28966519600     273899     31-12-11

现在,可用于分析的交易数据的时间范围是什么?

问题的第二部分是:

同时显示number of DaysMonthsYears中的输出。

这两个都应在单个查询中完成。

我在下面使用查询来获取日期,月份和年份,但是我一直在寻找时间范围。

  SELECT 
    MIN(CAST(CAST(tran_date AS NCHAR(8)) AS date)) AS Start_tran_Date
    ,MAX(CAST(CAST(tran_date AS NCHAR(8)) AS date)) AS End_tran_Date
    ,DATEDIFF(DAY,MAX(CAST(CAST(tran_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(tran_date AS NCHAR(8)) AS date)) ) AS Difference_Days
    ,DATEDIFF(MONTH,MAX(CAST(CAST(tran_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(tran_date AS NCHAR(8)) AS date)) ) AS Difference_Months
    ,DATEDIFF(YEAR,MAX(CAST(CAST(tran_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(tran_date AS NCHAR(8)) AS date)) ) AS Difference_Years
FROM Transactions

但是它给了我这个错误:

Msg 241,级别16,状态1,第50行,转换时转换失败字符串中的日期和/或时间。

我想要在输出

tran_date_start  tran_date_end  No.of Days  No.of Months  No.of Years
sql sql-server
3个回答
1
投票

您的日期格式为dd-mm-yy,因此,如果您的CAST如下所示。

SELECT CAST('28-02-14' AS DATE)

这是不正确的,这就是您得到错误的原因

从字符串转换日期和/或时间时转换失败。

您应该改用Convert,看起来像这样

SELECT Convert(DATE,'28-02-14',3)

1
投票

Bouling on Anoymous'的答案,您可以使用子查询使代码更清晰-像这样:

SELECT 
    MIN(trans_dt) AS Start_tran_Date,
    MAX(trans_dt) AS End_tran_Date,
    DATEDIFF(DAY,  MAX(trans_dt), MIN(trans_dt) ) AS Difference_Days,
    DATEDIFF(MONTH,MAX(trans_dt), MIN(trans_dt) ) AS Difference_Months,
    DATEDIFF(YEAR, MAX(trans_dt), MIN(trans_dt) ) AS Difference_Years
FROM (
  SELECT transaction_id,   cust_id,  CONVERT(date,tran_date,3) as tran_dt
  FROM Transaction
)

0
投票

**编辑

当您将日期存储为VARCHAR时,不建议这样做(始终将日期格式设置为日期),您需要将值转换为NCHAR,然后转换为日期以进行计算。

如果只需要天数之间的时差,则可以使用DATEDIFF函数,在其中找到两个日期之间的时差。通过使用you数据中的MIN(date)MAX(date)之差,您将获得这两个日期之间的天数。

SELECT 
    MIN(CAST(CAST(trans_date AS NCHAR(8)) AS date)) AS Start_tran_Date
    ,MAX(CAST(CAST(trans_date AS NCHAR(8)) AS date)) AS End_tran_Date
    ,DATEDIFF(DAY,MAX(CAST(CAST(trans_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(trans_date AS NCHAR(8)) AS date)) ) AS Difference_Days
    ,DATEDIFF(MONTH,MAX(CAST(CAST(trans_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(trans_date AS NCHAR(8)) AS date)) ) AS Difference_Months
    ,DATEDIFF(YEAR,MAX(CAST(CAST(trans_date AS NCHAR(8)) AS date)), MIN(CAST(CAST(trans_date AS NCHAR(8)) AS date)) ) AS Difference_Years
FROM Transactions

这将为您提供以下输出:

Start_tran_Date   End_tran_Date   Difference_Days   Difference_Months  Difference_Years 
2011-12-31        2014-02-28      790               26                 3
© www.soinside.com 2019 - 2024. All rights reserved.