我有一个名为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 Days
,Months
和Years
中的输出。
这两个都应在单个查询中完成。
我在下面使用查询来获取日期,月份和年份,但是我一直在寻找时间范围。
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
您的日期格式为dd-mm-yy
,因此,如果您的CAST
如下所示。
SELECT CAST('28-02-14' AS DATE)
这是不正确的,这就是您得到错误的原因
从字符串转换日期和/或时间时转换失败。
您应该改用Convert
,看起来像这样
SELECT Convert(DATE,'28-02-14',3)
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
)
**编辑
当您将日期存储为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