web-dev-qa-db-ja.com

Sybaseの日付比較-正しい形式?

私はSybaseにかなり慣れていないため、指定した日付の後、指定した日付の前に結果を返すクエリを作成しています。 MM/DD/YYYY形式

現時点ではim ..

SELECT * 
    From aTable
      WHERE afterDate >= 08/07/2013
        AND beforeDate <= 08/08/2013

私はレコードを取り戻していますが、私はSybaseの初心者なので、Sybaseがこれらの日付を正しく解釈していることを確認したいと思います。

彼らのオンラインドキュメントは、このようなことについての基本的な説明にはかなり悪いです!私の作品が機能しているかどうかを確認できる人はいますか、それとも日付の周りにいくつかの書式設定が必要ですか?

6
deanmau5

日付をDATETIMEに変換し、確実にフォーマットをsybaseに通知する必要があります。
このドキュメント によれば、MM/DD/YYYYのコードは101なので、次のようになります:

SELECT * 
FROM aTable
WHERE afterDate >= CONVERT(DATETIME,'08/07/2013',101)
      AND beforeDate <= CONVERT(DATETIME,'08/08/2013',101)

次の選択ステートメントを実行すると、違いを確認できます。

SELECT CONVERT(DATETIME,'08/07/2013',101)  --MM/DD/YYYY (2013-08-07 00:00:00.000)
SELECT CONVERT(DATETIME,'08/07/2013',103)  --DD/MM/YYYY (2013-07-08 00:00:00.000)
12
twoleggedhorse
CAST( '2000-10-31' AS DATE )

テキストから日付形式に変換されます...

2つのフィールド(afterDateとbeforeDate)が日付形式であると想定しています。

あなたの例は:

SELECT * 
From aTable
  WHERE afterDate >= CAST( '08/07/2013' AS DATE )
    AND beforeDate <= CAST( '08/08/2013' AS DATE )

また、通常(常にではありませんが)、日付範囲はSAMEフィールドにあります。私が言ったように、それはいつも真実ではありません、そしてあなたにはそれについての正当な理由があるかもしれません。

4
Jim

Sybaseの任意の日時フィールドの場合、convert関数を経由する代わりに、より直接的なアプローチがあります。

SELECT * 
From aTable
  WHERE afterDate >= '2013-08-07'
    AND beforeDate <= '2013-08-08'

日付は'YYYY-MM-DD'の形式である必要があります

時間を追加する場合は、日付とともに含めることができます。日付と時刻はTで区切る必要があります。

'YYYY-MM-DDTHH:MM:SS'の形式を使用して、任意の日時フィールドを直接使用できます。

関数の使用には時間がかかりすぎます。リスを撃つためにバズーカが必要な人はいません。 :)

3
Gaurav Swaroop

最善の方法は、変換を必要としないANSI標準を使用することです。たとえば、yyyymmdd(hh:mm:ssを含めることもできます)。

DateField1> = "20150101"およびDateFile1 <= "20150102"

1
David

ユーザーがどの入力文字列をパラメーターとして使用するかを決定し、それらを変換して、必要に応じて連結する必要があります。日付時刻である場合を除き、どの初期形式であるかが重要でない場合は、条件間で使用できます。

例:ユーザーはヨーロッパ出身で、「DD.MM.YY」と「hh:mm」を入力パラメーターとして使用する場合、次のように変換して連結します。

 WHERE dateCol between convert(DATETIME, 
                               convert(char(11), 
                                       convert(DATETIME, '01.06.14', 4), 16) || ' ' || '00:00', 8) 
    AND convert(DATETIME, 
                convert(char(11), 
                        convert(DATETIME, '01.07.14', 4), 16) || ' ' || '16:00', 8)
0
Clevemayer