将YYYYMMDDXXXXXX转换为可工作日期

时间:2013-10-04 13:42:07

标签: sql sql-server date

enter image description here好吧我知道很多问题都是基于日期格式的,但这是我的问题。我正在使用字段,我们称之为ABCTIME,它以数字格式保存,并显示为20110517151750,即2011-05-17:15:17:50。我需要能够将其转换为日期或datetime,以便我可以使用datediff来显示所有大于或等于今天日期(GETDATE)的记录。另外,我无法更改表格的格式。任何帮助将不胜感激。谢谢 -

编辑 - 我需要显示1年或者比今天更好的所有记录。

6 个答案:

答案 0 :(得分:2)

将getdate()转换为YYYYMMDDXXXXXX以过滤大于或等于今天而不是将数据转换为适合这一条件的效率要高得多。

修改 - 显示所有1年或更早的记录

SELECT
    *
FROM your_table
WHERE yyyymmddxxxxxx >= cast( convert(varchar, dateadd(YEAR,1,getdate()) ,112) AS bigint) * 1000000

您的样本没有超过2012年的任何内容所以我将其更改为2015年,结果如下:

    CREATE TABLE sample_data
        ([Case] int, [Service] varchar(13), [DateInt] bigint)
    ;

    INSERT INTO sample_data
        ([Case], [Service], [DateInt])
    VALUES
        (1, 'CHAMP VA', 20120928073334),
        (2, 'MACSIS-MH POS', 20120927103950),
        (3, 'MACSIS-MH POS', 20150927084716)
    ;

**Query 1**:

    --YYYYMMDDXXXXXX
    SELECT
           DateInt
         , convert(date,convert(varchar,DateInt / 1000000),112) as_date
         , DateInt / 1000000                                    as_int_yyymmdd
    FROM sample_data
    WHERE DateInt >= cast( convert(varchar, dateadd(YEAR,1,getdate()) ,112) AS bigint) * 1000000


**[Results][2]**:

    |        DATEINT |    AS_DATE | AS_INT_YYYMMDD |
    |----------------|------------|----------------|
    | 20150927084716 | 2015-09-27 |       20150927 |

请参阅this sqlfiddle

答案 1 :(得分:2)

你可以创建这样的函数:

    CREATE FUNCTION udf_convert_int_date (@date_in INT)  
RETURNS datetime 
AS 
BEGIN 
   DECLARE @date_out datetime 
   SET @date_out = CONVERT(datetime, CAST(@date_in AS CHAR(8)), 101) 

   RETURN @date_out 
END 

答案 2 :(得分:2)

可以查询当前格式的日期。我不明白为什么你需要重新格式化日期。如果今天的日期减去1年是2012年12月31日(20121231000000),则返回ABCTIME> = 20121231000000的所有记录。

答案 3 :(得分:1)

它可能不是很漂亮,但如果它总是一个设置格式和每个部分的字符,你可以简单地使用子字符串或类似的功能分解它吗?在SQL Server中将日期转换为120格式(yyyy-mm-dd hh:mi:ss),这将是:

SELECT
    -- 20110517151750 to 2011-05-17 15:17:50
    SUBSTRING('20110517151750', 1, 4) AS Year,
    SUBSTRING('20110517151750', 5, 2) AS Month,
    SUBSTRING('20110517151750', 7, 2) AS Day,
    SUBSTRING('20110517151750', 9, 2) AS Hour,
    SUBSTRING('20110517151750', 11, 2) AS Minute,
    SUBSTRING('20110517151750', 13, 2) AS Second,
    CONVERT(datetime, SUBSTRING('20110517151750', 1, 4) + '-' + SUBSTRING('20110517151750', 5, 2) + '-' + SUBSTRING('20110517151750', 7, 2) + ' ' + SUBSTRING('20110517151750', 9, 2) + ':' + SUBSTRING('20110517151750', 11, 2) + ':' + SUBSTRING('20110517151750', 13, 2), 120) AS ParsedDate
FROM ...

答案 4 :(得分:0)

如果您使用的是SQLServer 2008及更高版本,则它现在具有Date数据类型,该数据类型仅包含没有时间的日期。所以你可以做到以下几点:

SELECT CONVERT(date, getdate())

答案 5 :(得分:0)

编辑,使用ISDATE()对验证,改变方法有意义。

关于转换错误,我可以假设一些数据不符合某些日期/时间'规则'。考虑到这一点,或许尝试这样的事情来发现这些条件。这很简单,但可能会有所帮助。请注意,您可以首先将其作为计数(*),因为我不知道您正在处理多少记录,并且不会说这将是非常快的。

SELECT
  yyyymmddxxxxxx
, CASE WHEN isdate( (yyyy + '0101') ) = 0
            OR ( yyyy < '1960' OR yyyy > '2020' ) THEN yyyy ELSE '' END AS yyyy
, CASE WHEN isdate( (yyyy + mm + '01') ) = 0      THEN mm ELSE '' END AS mm
, CASE WHEN isdate( (yyyy + mm + dd) ) = 0        THEN dd ELSE '' END AS dd
, CASE WHEN ( hh > '23' )                         THEN hh ELSE '' END AS hh
, CASE WHEN ( mi > '59' )                         THEN mi ELSE '' END AS mi
, CASE WHEN ( ss > '59' )                         THEN ss ELSE '' END AS ss
FROM your_table
CROSS apply (SELECT convert(varchar(14), yyyymmddxxxxxx)) AS ca1 (int2str)
CROSS apply (SELECT
                     substring(int2str, 1,4) -- yyyy
                   , substring(int2str, 5,2) -- mm
                   , substring(int2str, 7,2) -- dd
                   , substring(int2str, 9,2) -- hh
                   , substring(int2str,11,2) -- mi
                   , substring(int2str,13,2) -- ss
             ) AS ca2 (yyyy,mm,dd,hh,mi,ss)
WHERE ISDATE(convert(varchar(8),int2str,112)) = 0
OR ISDATE( (hh + ':' + mi + ':' + ss) ) = 0
OR         ( yyyy < '1960' OR yyyy > '2020' ) -- arbitrary, ignore of change to suit
;

http://sqlfiddle.com/#!3/9ab73/1输出如下:

| YYYYMMDDXXXXXX | YYYY | MM | DD | HH | MI | SS |
|----------------|------|----|----|----|----|----|
| 99990410123456 | 9999 |    |    |    |    |    |
| 20149910123456 |      | 99 | 10 |    |    |    |
| 20140499123456 |      |    | 99 |    |    |    |
| 20140410993456 |      |    |    | 99 |    |    |
| 20140410129956 |      |    |    |    | 99 |    |
| 20140410123499 |      |    |    |    |    | 99 |
| 20140231123499 |      |    | 31 |    |    |    |