0

ここに画像の説明を入力私の質問の多くは日付形式に基づいていることはわかっていますが、ここに私の問題があります。私はフィールドで作業しています。それを と呼びましょう。ABCTIME数値形式で保存され、そのように表示され20110517151750ます2011-05-17:15:17:50。これを日付に変換できるようにするか、datetimea を使用して、datediff今日の日付 ( ) より大きいまたは = のすべてのレコードを表示できるようにする必要がありGETDATEます。また、テーブルのフォーマットを変更することはできません。どんな助けでも大歓迎です。ありがとう -

編集 - 今日の日付より 1 年以上のすべてのレコードを表示する必要があります。

4

6 に答える 6

2

getdate() を YYYYMMDDXXXXXX に変換して、データをその 1 つの条件に合わせて変換するよりも、今日よりも大きいまたは = でフィルタリングする方がはるかに効率的です。

編集- 今日の日付より 1 年以上のすべてのレコードを表示する

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

あなたのサンプルには 2012 年以降は何も含まれていなかったので、1 つを 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 |

このsqlfiddleを参照してください

于 2013-10-04T13:47:47.913 に答える
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 ...
于 2013-10-04T14:02:34.517 に答える
0

SQLServer 2008 以降を使用している場合は、時刻のない日付のみを含む Date データ型が含まれるようになりました。したがって、次のことができます。

SELECT CONVERT(date, getdate())
于 2013-10-04T13:55:11.737 に答える
0

編集、ISDATE() の使用は、検証、アプローチの変更に意味があります。

その変換エラーに関して、私が推測できるのは、一部のデータが一部の日付/時刻の「ルール」を満たしていないということだけです。それを念頭に置いて、おそらくこれらの条件の発見のためにこのようなことを試してみてください。単純ですが参考になるかもしれません。あなたが扱っているレコードの数がわからず、これが超高速になるとは言いませんので、最初にこれを count(*) として実行できることに注意してください。

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 |    |    |    |
于 2013-10-11T10:31:50.387 に答える